home *** CD-ROM | disk | FTP | other *** search
/ C & C++ Multimedia Cyber Classroom / C and C++ Multimedia Cyber Classroom (Prentice Hall) (1998).iso / cpphtp2 / cpphtp2.jar / chpt_07.gml < prev    next >
Text File  |  1998-03-03  |  106KB  |  2,561 lines

  1. <html>
  2. <chapter>
  3. <section type=Popup name=Quotes title="Quotes">
  4. <page>
  5. <i>But what, to serve our 
  6. private ends,<p>
  7. Forbids the cheating of 
  8. our friends?
  9. </i><br>
  10. Charles Churchill<br>
  11. <br>
  12.  
  13. </page>
  14. <page>
  15. <i>Instead of this absurd 
  16. division into sexes they 
  17. ought to class people as 
  18. static and dynamic.
  19. </i><br>
  20. Evelyn Waugh<br>
  21. <br>
  22.  
  23. </page>
  24. <page>
  25. <i>This above all: to thine 
  26. own self be true.
  27. </i><br>
  28. William Shakespeare, 
  29. Hamlet<br>
  30. <br>
  31.  
  32. </page>
  33. <page>
  34. <i>Have no friends not equal 
  35. to yourself.
  36. </i><br>
  37. Confucius<br>
  38. <br>
  39.  
  40. </page>
  41. </section>
  42. <section type=Popup name=Answers title="Answers">
  43. <page pagename="Answers 7.1">
  44. <b>Answers 7.1</b><br>
  45. a)  Member initializer.<br>
  46. b)  <b>friend</b>.<br>
  47. c) <b> new</b>, pointer.<br>
  48. d)  initialized.<br>
  49. e)  <b>static</b>.<br>
  50. f)  <b>this</b>.<br>
  51. g)  <b>const</b>.<br>
  52. h)  default constructor.<br>
  53. i)  non-<b>static</b>.<br>
  54. j)  before. <br>
  55. <foreign  name="exercises" url="^Exercises::c:s0p0">
  56.  
  57. </page>
  58. <page pagename="Answers 7.1">
  59. k)  <b>delete</b>.<br>
  60. <foreign  name="exercises" url="^Exercises::c:s0p0">
  61. <br>
  62.  
  63. </page>
  64. <page pagename="Answers 7.2">
  65. <b>Answers 7.2</b><br>
  66. a)  Error: The class definition for <b>Example</b> has two errors. The first occurs in 
  67. function <b>getIncrementedData</b>. The function is declared <b>const</b>, but it modifies 
  68. the object.<br>
  69.      Correction: To correct the first error, remove the <b>const</b> keyword from the 
  70. definition of <b>getIncrementedData</b>. <br>
  71.      Error: The second error occurs in function <b>getCount</b>. This function is declared 
  72. <b>static</b>, so it is not allowed to access any non-<b>static</b> member of the class.<br>
  73.      Correction: To correct the second error, remove the output line from the 
  74. definition of <b>getCount</b>.<br>
  75. <foreign  name="exercises" url="^Exercises::c:s0p2">
  76.  
  77. </page>
  78. <page pagename="Answers 7.2">
  79. b)  Error: Memory dynamically allocated by <b>new</b> is deleted by the C Standard 
  80. Library function <b>free</b>.<br>
  81.      Correction: Use C++'s <b>delete</b> operator to reclaim the memory. C-style 
  82. dynamic memory allocation should not be mixed with C++'s <b>new</b> and <b>delete</b> 
  83. operators.<br>
  84. <foreign  name="exercises" url="^Exercises::c:s0p2">
  85. <br>
  86.  
  87. </page>
  88. <page pagename="Answer 7.7">
  89. <b>Answer 7.7</b><br>
  90. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  91. the file cpphtp2/answers/P7_07.zip to your hard drive and unzip the program 
  92. code.<br>
  93. <foreign  name="exercises" url="^Exercises::c:s0p8">
  94.  
  95. </page>
  96. <page pagename="Answer 7.8">
  97. <b>Answer 7.8</b><br>
  98. The solution to this exercise can be found on your Cyber Classroom CD. Copy 
  99. the file cpphtp2/answers/P7_08.zip to your hard drive and unzip the program 
  100. code.<br>
  101. <foreign  name="exercises" url="^Exercises::c:s0p9">
  102.  
  103. </page>
  104. </section>
  105. <section type=Body name=Default title="7 Classes: Part II">
  106. <page>
  107. <font size=18 bold>7 Classes: Part II</font><hr>
  108. <a href="#s1p0">7.1<spacer width=20 height=1>Introduction</a>  <br>
  109. <a href="#s2p0">7.2<spacer width=20 height=1><b>const</b> (Constant) Objects and <b>const</b> Member 
  110. Functions</a>  <br>
  111. <a href="#s3p0">7.3<spacer width=20 height=1>Composition: Objects as Members of Classes</a>  <br>
  112. <a href="#s4p0">7.4<spacer width=20 height=1><b>friend</b> Functions and <b>friend</b> Classes</a>  <br>
  113. <a href="#s5p0">7.5<spacer width=20 height=1>Using the <b>this</b> Pointer</a>  <br>
  114. <a href="#s6p0">7.6<spacer width=20 height=1>Dynamic Memory Allocation with Operators <b>new</b> 
  115. and <b>delete  
  116. </b></a><br>
  117. <a href="#s7p0">7.7<spacer width=20 height=1><b>static</b> Class Members</a>  <br>
  118. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  119. <foreign  name="quotes" url="^Quotes::c:s0p0">
  120.  
  121. </page>
  122. <page>
  123. <a href="#s8p0">7.8<spacer width=20 height=1>Data Abstraction and Information Hiding</a>  <br>
  124. <a href="#s9p0">7.9<spacer width=20 height=1>Container Classes and Iterators</a>  <br>
  125. <a href="#s10p0">7.10<spacer width=20 height=1>Proxy Classes</a>  <br>
  126. <a href="#s11p0">7.11<spacer width=20 height=1>Thinking About Objects: Using Composition and 
  127. Dynamic Object Management in the Elevator Simulator</a>  <br>
  128. <a href="#s12p0">7.12<spacer width=20 height=1>Elevator Laboratory Assignment 6</a>  <br>
  129. <a href="#s13p0">7.13<spacer width=20 height=1>Summary </a> <br>
  130. <a href="^Terminology::c:s0p0">Terminology</a>  <br>
  131. <a href="^Illustration::c:s0p0">Figures</a>  <br>
  132. <foreign  name="objectivesButton" url="^Objective::c:s0p0">
  133. <foreign  name="quotes" url="^Quotes::c:s0p0">
  134.  
  135. </page>
  136. </section>
  137. <section type=Body name=Default title="7.1 Introduction">
  138. <page>
  139. <font size=18 bold>7.1 Introduction</font><hr>
  140. In this chapter we continue our study of classes and 
  141. data abstraction. We discuss many more advanced 
  142. topics and lay the groundwork for the discussion of 
  143. classes and operator overloading in Chapter 8. The 
  144. discussion in Chapters 6 through 8 encourages 
  145. programmers to use objects, what we call <i>object-based 
  146. programming (OBP)</i>. Then, Chapters 9 and 10 
  147. introduce inheritance and polymorphism--the 
  148. techniques of truly <i>object-oriented programming 
  149. (OOP)</i>. In this and several subsequent chapters, we use 
  150. the C-style strings we introduced in Chapter 5. This will <br>
  151.  
  152. </page>
  153. <page>
  154. help the reader master the complex topic of C pointers 
  155. and prepare for the professional world in which the 
  156. reader will see a great deal of C legacy code that has 
  157. been put in place over the last two decades. In Chapter 
  158. 19, "Class <b>string</b>," we discuss the new style of strings, 
  159. namely strings as full-fledged class objects. Thus, the 
  160. reader will become familiar with the two most prevalent 
  161. methods of creating and manipulating strings in C++.<br>
  162.  
  163. </page>
  164. </section>
  165. <section type=Body name=Default title="7.2 const (Constant) Objects and const Member Functions">
  166. <page>
  167. <font size=18 bold>7.2 <b>const</b> (Constant) Objects and <b>const</b> Member Functions</font><hr>
  168.  <a href="^Engineer::c:s0p0"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>We have emphasized the <i>principle of least privilege </i>as  
  169. one of the most fundamental principles of good 
  170. software engineering. Let us see how this principle 
  171. applies to objects.<br>
  172. <spacer width=16 height=1> <a href="^Engineer::c:s0p1"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>Some objects need to be modifiable and some do not. 
  173. The programmer may use the keyword <b>const</b> to specify 
  174. that an object is not modifiable, and that any attempt to  
  175. modify <a href="^Perform::c:s0p0"> <img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>the object is a syntax error. For example,<br>
  176. <font size=2><br></font><font size=11><pre>
  177. const Time noon( 12, 0, 0 );<p>
  178. </pre></font>
  179.  
  180. </page>
  181. <page>
  182. declares a <b>const</b> object <b>noon</b> of class <b>Time</b> and 
  183. initializes it to 12 noon.<br>
  184. <spacer width=16 height=1>C++ <a href="^Engineer::c:s0p2"> <img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>compilers disallow any member function calls for 
  185. <b>const</b> objects unless the member functions themselves 
  186. are also declared <b>const</b>. This is true even for <i>get</i> 
  187. member functions that do not modify the object. 
  188. Member functions <a href="^Errors::c:s0p0"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>declared <b>const</b> cannot modify the 
  189. object--the compiler <a href="^Errors::c:s0p1"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>disallows this. <br>
  190. <spacer width=16 height=1>A function is specified as <b>const</b> <i>both</i> in its prototype 
  191. and <a href="^Errors::c:s0p2"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>in its definition by inserting the keyword <b>const</b> 
  192. after the function's parameter list, and, in the case of 
  193. the function definition, before the left brace that begins <br>
  194.  
  195. </page>
  196. <page>
  197. the function body. For example, the following member 
  198. function of class <b>A
  199. </b><br>
  200. <font size=2><br></font><font size=11><pre>
  201. int A::getValue() const { return privateDataMember };<p>
  202. </pre></font>
  203. simply returns the value of one of the object's data 
  204. members, and is appropriately declared <b>const</b>. <br>
  205. <spacer width=16 height=1>An interesting problem arises here for constructors and 
  206. destructors, each of which often needs to  <a href="^Errors::c:s0p3"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>modify 
  207. objects. The <b>const</b> declaration is not required for 
  208. constructors and destructors of <b>const</b> objects. A 
  209. constructor must be allowed to modify an object so that 
  210. the object can be initialized properly. A destructor must <br>
  211.  
  212. </page>
  213. <page>
  214. be able to perform its termination housekeeping chores 
  215. before an object is destroyed.<br>
  216. <spacer width=16 height=1>The program of  <a href="^Code::c:s0p0"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.1</a> instantiates two <b>Time</b> 
  217. objects--one  <a href="^Practice::c:s0p0"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>non-<b>const</b> object and one <tt><b>const</b></tt> object. 
  218. The program attempts to modify the <tt><b>const</b></tt> object <b>noon</b> 
  219. with non-<b>const</b> member functions <b>setHour</b> (at line 100) 
  220. and <b>printStandard</b> (at line 106). The program also 
  221. illustrates the three other combinations of member 
  222. function calls on objects--a non-<b>const</b> member 
  223. function on a non-<b>const</b> object (line 98), a <tt><b>const</b></tt> 
  224. member function on a non-<b>const</b> object (line 102) and a 
  225. <b>const</b> member function on a <b>const</b> object (line 104 and 
  226. 105). The messages generated by one popular compiler <br>
  227.  
  228. </page>
  229. <page>
  230. for non-<b>const</b> member functions called on a <b>const</b> 
  231. object are shown in the output window. <br>
  232. <spacer width=16 height=1>Notice that even though a constructor must be a non-
  233. <b>const</b> member function, it can still be called for a <b>const</b> 
  234. object. The definition of the <b>Time</b> constructor at lines 
  235. 39 and 40 <br>
  236. <font size=2><br></font><font size=11><pre>
  237. Time::Time( int hr, int min, int sec ) <p>
  238.    { setTime( hr, min, sec ); }<p>
  239. </pre></font>
  240. shows that the <b>Time</b> constructor calls another non-
  241. <b>const</b> member function--<b>setTime</b>--to  <a href="^Engineer::c:s0p7"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>perform the 
  242. initialization of a <b>Time</b> object. Invoking a non-<b>const</b> 
  243. member function from the constructor call for a <tt><b>const</b></tt> 
  244. object is allowed.<br>
  245.  
  246. </page>
  247. <page>
  248. Also notice that line 106 (line 21 in the source file)<br>
  249. <font size=2><br></font><font size=11><pre>
  250. noon.printStandard();  // non-const         const<p>
  251. </pre></font>
  252. generates a compiler error even though member 
  253. function <b>printStandard</b> of class <b>Time</b> does not modify 
  254. the object on which it is invoked.<br>
  255. <spacer width=16 height=1> <a href="^Code::c:s0p1"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 7.2</a> demonstrates the use of a member initializer 
  256. to initialize <b>const</b> data member <b>increment</b> of class 
  257. <b>Increment.</b> The constructor for <b>Increment</b> is modified 
  258. as follows:<br>
  259. <font size=2><br></font><font size=11><pre>
  260. Increment::Increment( int c, int i )<p>
  261.    : increment( i )<p>
  262. { count = c; }<p>
  263. </pre></font>
  264.  
  265. </page>
  266. <page>
  267. The notation <b>: increment( i )</b> initializes <b>increment</b> to 
  268. the value <b>i</b>. If multiple member initializers are needed, 
  269. simply include them in a comma-separated list after the 
  270. colon.  <a href="^Debug::c:s0p0"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>All data members <i>can</i> be initialized using 
  271. member <a href="^Engineer::c:s0p6"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>initializer syntax, but <b>const</b>s and references 
  272. <i>must</i> be <a href="^Errors::c:s0p4"> <img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>initialized in this manner. Later in this chapter, 
  273. we will see that member objects must be initialized this 
  274. way. In Chapter 9 when we study inheritance, we will 
  275. see that base class portions of derived classes also must 
  276. be initialized this way.<br>
  277. <spacer width=16 height=1> <a href="^Code::c:s0p2"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 7.3</a> illustrates the compiler errors issued by one 
  278. popular C++ compiler for a program that attempts to <br>
  279.  
  280. </page>
  281. <page>
  282. initialize <b>increment</b> with an assignment statement 
  283. rather than with a member initializer.<br>
  284. Note that the <b>print</b> function at line 24 is declared <b>const</b>. 
  285. It is <a href="^Engineer::c:s0p9"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>reasonable, yet strange, to label this function <b>const</b> 
  286. because we will probably never have a <b>const 
  287. Increment</b> object. <br>
  288. <spacer width=16 height=1>C++ provides a new keyword called <tt><i><b>mutable</b></i></tt> that 
  289. affects the treatment <a href="^Debug::c:s0p1"><img src="bckgrnds/icons/dbt_ico.gif" align=sidebar></a>of <b>const</b> objects in a program. We 
  290. discuss keyword <b>mutable</b> in Chapter 21.<br>
  291.  
  292. </page>
  293. <page>
  294. <b>Select the true statement(s). </b><br>
  295. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. An object can be declared const.">
  296. An object cannot be declared as const.   <br>
  297. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  298. Member functions declared const cannot modify the object.  <br>
  299. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  300. Destructors cannot be declared const. <br>
  301. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Constructors cannot be declared const.">
  302. Constructors may declared const. <br>
  303. <component type=button name=b label="Check Your Answer" width=125 height=24>
  304.  
  305. </page>
  306. </section>
  307. <section type=Body name=Default title="7.3 Composition: Objects as Members of Classes">
  308. <page>
  309. <font size=18 bold>7.3 Composition: Objects as Members of 
  310. Classes</font><hr>
  311. An <b>AlarmClock</b> class object needs to know when it is 
  312. supposed to sound its alarm, so why not include a <b>Time</b> 
  313. object as a member of the <b>AlarmClock object</b>? Such a 
  314. capability is <a href="^Engineer::c:s0p11"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>called <i>composition</i>. A class can have 
  315. objects of other classes as members.<br>
  316. <spacer width=16 height=1>When an object is created, its constructor is called 
  317. automatically, so we need to specify how arguments are 
  318. passed to member-object constructors. Member objects 
  319. are constructed in the order in which they are declared 
  320. (not in the order they are listed in the constructor's <br>
  321.  
  322. </page>
  323. <page>
  324. member initializer list) and before their enclosing class 
  325. objects (sometimes called <i>host objects</i>) are constructed.<br>
  326. <spacer width=16 height=1> <a href="^Code::c:s0p3"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 7.4</a> uses class <b>Employee</b> and class <b>Date</b> to 
  327. demonstrate objects as members of other objects. Class 
  328. <b>Employee</b> contains <b>private </b>data members <b>firstName</b>, 
  329. l<b>astName</b>, <b>birthDate</b>, and <b>hireDate</b>. Members 
  330. <b>birthDate</b> and <b>hireDate </b>are <b>const</b> objects of class <b>Date</b> 
  331. which contains <b>private</b> data members <b>month</b>, <b>day</b> and 
  332. <b>year</b>. The program instantiates an <b>Employee</b> object, 
  333. and initializes and displays its data members. Note the 
  334. syntax of the function header in the <b>Employee</b> 
  335. constructor definition:<br>
  336.  
  337. </page>
  338. <page>
  339. <font size=2><br></font><font size=11><pre>
  340. Employee::Employee( char *fname, char *lname,<p>
  341.                    int bmonth, int bday, int byear,<p>
  342.                    int hmonth, int hday, int hyear )<p>
  343.    : birthDate( bmonth, bday, byear ), <p>
  344.      hireDate( hmonth, hday, hyear )<p>
  345. </pre></font>
  346. The constructor takes eight arguments (<b>fname</b>, <b>lname</b>, 
  347. <b>bmonth</b>, <b>bday</b>, <b>byear</b>, <b>hmonth</b>, <b>hday</b>, and <b>hyear</b>). The 
  348. colon (<b>:</b>) in the header separates the member initializers 
  349. from the parameter list. The member initializers specify 
  350. the <b>Employee</b> arguments being passed to the 
  351. constructors of the member objects. Arguments 
  352. <b>bmonth</b>, <b>bday</b>, and <b>byear</b> are passed to the <b>birthDate</b> 
  353. constructor, and arguments <b>hmonth</b>, <b>hday</b>, and <b>hyear</b> <br>
  354.  
  355. </page>
  356. <page>
  357. are passed to the <b>hireDate</b> constructor. Multiple 
  358. member initializers are separated by commas. <br>
  359. <spacer width=16 height=1>Remember that <tt><b>const</b></tt> members and references are also 
  360. initialized in the member initializer list (in Chapter 9, 
  361. we will see that base class portions of derived classes 
  362. are also initialized this way). Class <b>Date</b> and class 
  363. <b>Employee</b> each include a destructor function that prints 
  364. a message when a <b>Date</b> object or an <b>Employee</b> object is 
  365. destroyed, respectively. This enables us to confirm in 
  366. the program output that objects are constructed from the 
  367. inside out and destructed in the reverse order from the 
  368. outside in (i.e., the <b>Date</b> member objects are destroyed 
  369. after the <b>Employee</b> object that contains them). <br>
  370.  
  371. </page>
  372. <page>
  373. A member object does not need to be initialized 
  374. explicitly through a  <a href="^Perform::c:s0p2"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>member initializer. If a member 
  375. initializer is not provided, the member <a href="^Errors::c:s0p5"> <img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>object's default 
  376. constructor will be called implicitly. Values, if any, 
  377. established by the default <a href="^Engineer::c:s0p12"> <img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>constructor can be 
  378. overridden  by <i>set</i> functions.<br>
  379. <spacer width=16 height=1>Notice the call to <b>Date</b> member function <b>print</b> at line 
  380. 43. Many member functions of classes in C++ require 
  381. no arguments. This is because each member function 
  382. contains an implicit handle (in the form of a pointer) to 
  383. the object on which it operates. We discuss the implicit 
  384. pointer--called <tt><i><b>this</b></i></tt>--in <a href="#s5p0">Section 7.5</a>.<br>
  385.  
  386. </page>
  387. <page>
  388. In this first version of our <b>Employee</b> class (for ease of 
  389. programming), we use two 25-character arrays to 
  390. represent the first and last name of the <b>Employee</b>. 
  391. These arrays may be a waste of space for names shorter 
  392. than 24 characters (remember one character in each 
  393. array is for the terminating null character, <b>'\\0'</b>, of the 
  394. string). Also, names longer than 24 characters must be 
  395. truncated to fit into these character arrays. Later in this 
  396. chapter we will present another version of class 
  397. <b>Employee</b> that dynamically creates the exact amount of 
  398. space to hold the first and the last name. Also, we could 
  399. use two <b>string</b> objects to represent the names. Standard 
  400. library class <tt><b>string</b></tt> is presented in detail in Chapter 19.<br>
  401.  
  402. </page>
  403. <page>
  404. <b>Select the true statement(s). </b><br>
  405. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. A class can have objects of other classes as members. This is known as composition.">
  406. A class cannot have objects of other classes as members.   <br>
  407. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  408. If a member initializer is not provided for a member object, the member object's default constructor is called implicitly. <br>
  409. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  410. References and const members must be initialized in the member initializer list. <br>
  411. <component type=button name=b label="Check Your Answer" width=125 height=24>
  412.  
  413. </page>
  414. </section>
  415. <section type=Body name=Default title="7.4 friend Functions and friend Classes">
  416. <page>
  417. <font size=18 bold>7.4 <b>friend</b> Functions and <b>friend</b> Classes</font><hr>
  418. A <i>friend </i> function of a <a href="^Engineer::c:s0p13"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>class is defined outside that 
  419. class's scope, yet has the right to <a href="^Engineer::c:s0p14"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>access  <b>private</b> (and as 
  420. we will see in Chapter 9, "Inheritance," <b>protected</b>) 
  421. members of the class. A function or an entire class may 
  422. be declared to be a <b>friend</b> of another class. <br>
  423. <spacer width=16 height=1>Using <tt><b>friend</b></tt>  <a href="^Engineer::c:s0p15"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>functions enhances performance. A 
  424. mechanical example is shown here of how a <b>friend</b> 
  425. function works. Later in the book, <b>friend</b> functions are 
  426. used to overload operators for use with class objects 
  427. and to create iterator classes. Objects of an iterator class 
  428. are used to successively select items or perform an <br>
  429.  
  430. </page>
  431. <page>
  432. operation on items in a container class (see <a href="#s9p0">Section 7.9</a>) 
  433. object. Objects of container classes are capable of 
  434. storing items. Using <b>friends</b> is often appropriate when a 
  435. member function cannot be used for certain operations 
  436. as we will see in Chapter 8, "Operator Overloading."<br>
  437. <spacer width=16 height=1>To declare a function as a <b>friend</b> of a class, precede the 
  438. function prototype in the class definition with the 
  439. keyword <b>friend</b>.   <a href="^Practice::c:s0p1"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>To declare class <b>ClassTwo</b> as a 
  440. <b>friend </b>of class <b>ClassOne</b> place a declaration of the 
  441. form<br>
  442. <font size=2><br></font><font size=11><pre>
  443. friend class ClassTwo;<p>
  444. </pre></font>
  445. in the definition of class <b>ClassOne</b>.<br>
  446.  
  447. </page>
  448. <page>
  449. Friendship is granted, not taken, i.e., for class B to be a 
  450. <b>friend</b> of class A, class A must explicitly declare that 
  451. class B is its <b>friend</b>. Also, friendship is neither 
  452. symmetric nor transitive, i.e., if class A is a <b>friend</b> of 
  453. class B, and class B is a <b>friend</b> of class C, you cannot 
  454. infer that class B is a <b>friend</b> of class A (again, 
  455. friendship is not symmetric), that class C is a <b>friend</b> of 
  456. class B, or that class A is a <b>friend</b> of class C (again, 
  457. friendship is not transitive). <br>
  458. <spacer width=16 height=1> <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 7.5</a> demonstrates the declaration and use of 
  459. <tt><b>friend</b></tt> function <b>setX</b> for setting the <b>private</b> data 
  460. member <b>x </b>of class <b>count</b>. Note that the <b>friend</b> 
  461. declaration appears first (by convention) in the class <br>
  462.  
  463. </page>
  464. <page>
  465. declaration, even before <b>public</b> member functions are 
  466. declared. The program of <a href="^Code::c:s0p5"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.6</a> demonstrates the 
  467. messages produced by the compiler when non-<b>friend</b> 
  468. function <b>cannotSetX</b> is called to modify <b>private</b> data 
  469. member <b>x</b>.   <a href="^Code::c:s0p4"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figures 7.5</a> and <a href="^Code::c:s0p5"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>7.6</a> are intended to 
  470. introduce the "mechanics" of using <b>friend</b> functions--
  471. practical examples of using <b>friend</b> functions appear in 
  472. forthcoming chapters.<br>
  473. <spacer width=16 height=1>Note that function <b>setX</b> (line 17) is a C-style, stand-
  474. alone function--it is not a member function of class 
  475. <b>Count</b>. For this reason, when <b>setX</b> is invoked for object 
  476. <b>counter</b> we use the statement at line 29<br>
  477. <font size=2><br></font><font size=11><pre>
  478. setX( counter, 8 );  // set x with a friend<p>
  479. </pre></font>
  480.  
  481. </page>
  482. <page>
  483. that takes <b>counter</b> as an  <a href="^Engineer::c:s0p16"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>argument rather than using a 
  484. handle (such as the name of the object) to call the 
  485. function as in<br>
  486. <font size=2><br></font><font size=11><pre>
  487. counter.setX( 8 );<p>
  488. </pre></font>
  489. It is possible to specify overloaded functions as <b>friend</b>s 
  490. of a class. Each overloaded function intended to be a 
  491. <b>friend</b> must be explicitly declared in the class definition 
  492. as a <b>friend</b> of the class.<br>
  493.  
  494. </page>
  495. <page>
  496. <b>Select the true statement(s). </b><br>
  497. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  498. A friend function of a class can access all private data of the class. <br>
  499. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Friendship must be explicitly granted by a specific class.">
  500. Friendship is transitive. <br>
  501. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  502. A function or class may be designated a friend of another class.  <br>
  503. <component type=button name=b label="Check Your Answer" width=125 height=24>
  504.  
  505. </page>
  506. </section>
  507. <section type=Body name=Default title="7.5 Using the this Pointer">
  508. <page>
  509. <font size=18 bold>7.5 Using the <b>this</b> Pointer</font><hr>
  510. Every object has access to its own address through a 
  511. pointer called <b>this</b>. An object's <b>this</b> pointer is not part 
  512. of the object itself--i.e., the <b>this</b> pointer is not reflected 
  513. in the result of a <tt><b>sizeof</b></tt> operation on the object. Rather, 
  514. the <b>this</b> pointer is passed into the object (by the 
  515. compiler) as an implicit first argument on every non-
  516. <b>static</b> member function call to the object (<b>static</b> 
  517. members are discussed in <a href="#s7p0">Section 7.7</a>).<br>
  518. <spacer width=16 height=1>The <b>this</b> pointer is implicitly used to reference both the 
  519. data members and member functions of an object; it can 
  520. also be used explicitly. The type of the <b>this</b> pointer <br>
  521.  
  522. </page>
  523. <page>
  524. depends on the type of the object and whether the 
  525. member function in which <b>this</b> is used is declared 
  526. <b>const</b>. In a non-constant member function of class 
  527. <b>Employee</b>, the <b>this</b>  <a href="^Perform::c:s0p4"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>pointer has type <b>Employee * const 
  528. </b>(a constant pointer to an <b>Employee</b> object). In a 
  529. constant member function of class <b>Employee</b>, the <b>this</b> 
  530. pointer has type <b>const Employee * const</b> (a constant 
  531. pointer to an <b>Employee</b> object that is constant).<br>
  532. <spacer width=16 height=1>For now, we show a simple example of using the <b>this</b> 
  533. pointer explicitly; later in this chapter and in Chapter 8, 
  534. we show some substantial and subtle examples of using 
  535. <b>this</b>. Every non-<b>static</b> member function has access to <br>
  536.  
  537. </page>
  538. <page>
  539. the <b>this</b> pointer to the object for which the member is 
  540. being invoked. <br>
  541. <spacer width=16 height=1> <a href="^Code::c:s0p6"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 7.7</a> demonstrates the explicit use of the <b>this</b> 
  542. pointer to enable a member function of class <b>Test</b> to 
  543. print the <b>private</b> data <b>x</b> of a <b>Test</b> object. <br>
  544. <spacer width=16 height=1>For illustration purposes, the <b>print</b> member function in  
  545. <a href="^Code::c:s0p6"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.7</a> first prints <b>x</b> directly. Then, <b>print</b> uses two 
  546. different notations for accessing <b>x</b> through the <b>this</b> 
  547. pointer--the arrow operator (<b>-></b>) off the <b>this</b> pointer and 
  548. the dot operator (<b>.</b>) off the dereferenced <b>this</b> pointer.<br>
  549. <spacer width=16 height=1>Note the parentheses around <b>*this</b> when used with the 
  550. dot member selection operator (<b>.</b>). The parentheses are 
  551. needed because the dot operator has higher precedence <br>
  552.  
  553. </page>
  554. <page>
  555. than the <b>*</b> operator. Without the parentheses, the 
  556. expression <br>
  557. <font size=2><br></font><font size=11><pre>
  558. *this.x<p>
  559. </pre></font>
  560. would be evaluated as if it were parenthesized as 
  561. follows:<br>
  562. <font size=2><br></font><font size=11><pre>
  563. *( this.x )<p>
  564. </pre></font>
  565. which is a  <a href="^Errors::c:s0p6"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>syntax error because the dot operator cannot 
  566. be used with a pointer. <br>
  567. <spacer width=16 height=1>One interesting use of the <b>this</b> pointer is to prevent an 
  568. object from being assigned to itself. As we will see in 
  569. Chapter 8, "Operator Overloading," self-assignment <br>
  570.  
  571. </page>
  572. <page>
  573. can cause serious errors when the objects contain 
  574. pointers to dynamically allocated storage.<br>
  575. <spacer width=16 height=1>Another use of the <b>this</b> pointer is in enabling cascaded 
  576. member function calls.  <a href="^Code::c:s0p7"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Figure 7.8</a> illustrates returning 
  577. a reference to a <b>Time</b> object to enable member function 
  578. calls of class <b>Time</b> to be cascaded. Member functions 
  579. <b>setTime</b>, <b>setHour</b>, <b>setMinute</b>, and <b>setSecond</b> each 
  580. return <b>*this</b> with a return type of <b>Time &</b>.<br>
  581. <spacer width=16 height=1>Why does the technique of returning <b>*this</b> as a 
  582. reference work? The dot operator (<b>.</b>) associates from 
  583. left to right, so the expression<br>
  584. <font size=2><br></font><font size=11><pre>
  585. t.setHour( 18 ).setMinute( 30 ).setSecond( 22 );<p>
  586. </pre></font>
  587.  
  588. </page>
  589. <page>
  590. first evaluates <b>t.setHour( 18 )</b> then returns a reference 
  591. to object <b>t</b> as the value of this function call. The 
  592. remaining expression is then interpreted as<br>
  593. <font size=2><br></font><font size=11><pre>
  594. t.setMinute( 30 ).setSecond( 22 );<p>
  595. </pre></font>
  596. The <b>t.setMinute( 30 )</b> call executes and returns the 
  597. equivalent of <b>t</b>. The remaining expression is interpreted 
  598. as <br>
  599. <font size=2><br></font><font size=11><pre>
  600. t.setSecond( 22 );<p>
  601. </pre></font>
  602. Note the calls<br>
  603. <font size=2><br></font><font size=11><pre>
  604. t.setTime( 20, 20, 20 ).printStandard();<p>
  605. </pre></font>
  606. also use the cascading feature. These calls must appear 
  607. in this order in this expression because <b>printStandard</b> <br>
  608.  
  609. </page>
  610. <page>
  611. as defined in the class does not return a reference to <b>t</b>. 
  612. Placing the call to <b>printStandard</b> in the preceding 
  613. statement before the call to <b>setTime</b> results in a syntax 
  614. error.<br>
  615.  
  616. </page>
  617. <page>
  618. <b>Select the true statement(s). </b><br>
  619. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. It is not reflected in the sizeof operation.">
  620. The this pointer is reflected in the sizeof operation for an object.   <br>
  621. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  622. The this pointer is passed as an implicit first argument to a non-static member function by the compiler.  <br>
  623. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  624. Every object has access to its own address through the this pointer. <br>
  625. <component type=button name=b label="Check Your Answer" width=125 height=24>
  626.  
  627. </page>
  628. </section>
  629. <section type=Body name=Default title="7.6 Dynamic Memory Allocation with Operators new and delete">
  630. <page>
  631. <font size=18 bold>7.6 Dynamic Memory Allocation with Operators <b>new</b> and <b>delete
  632. </b></font><hr>
  633. The <b><i>new </i></b>and <b><i>delete</i></b> operators provide a nicer means of 
  634. performing dynamic memory allocation (for any built-
  635. in or user-defined type) than with C's <b>malloc</b> and <b>free</b> 
  636. function calls. Consider the following code<br>
  637. <font size=2><br></font><font size=11><pre>
  638. TypeName *typeNamePtr;<p>
  639. </pre></font>
  640. In ANSI C, to dynamically create an object of type 
  641. <b>TypeName</b>, you would say<br>
  642. <font size=2><br></font><font size=11><pre>
  643. typeNamePtr = malloc( sizeof( TypeName ) );<p>
  644. </pre></font>
  645.  
  646. </page>
  647. <page>
  648. This requires a function call to <b>malloc</b> and explicit use 
  649. of the <b>sizeof</b> operator. In versions of C prior to ANSI C, 
  650. you would also have to cast the pointer returned by 
  651. <b>malloc</b> with the cast <b>(TypeName *)</b>. Function <b>malloc</b> 
  652. does not provide any method of initializing the 
  653. allocated block of memory. In C++, you simply write<br>
  654. <font size=2><br></font><font size=11><pre>
  655. typeNamePtr = new TypeName;<p>
  656. </pre></font>
  657. The <b>new</b> operator automatically creates an object of the 
  658. proper size, calls the constructor for the object and 
  659. returns a pointer of the correct type. If new is unable to 
  660. find space, it returns a <b>0</b> pointer in versions of C++ 
  661. prior to the ANSI/ISO draft standard. [Note: In Chapter 
  662. 13, we will show you how to deal with <b>new</b> failures in <br>
  663.  
  664. </page>
  665. <page>
  666. the context of the ANSI/ISO C++ draft standard. In 
  667. particular, we will show how <tt><b>new</b></tt> "throws" an 
  668. "exception" and we will show how to "catch" that 
  669. exception and deal with it.] To free the space for this 
  670. object in C++ you must use the <b>delete</b> operator as 
  671. follows:<br>
  672. <font size=2><br></font><font size=11><pre>
  673. delete typeNamePtr;<p>
  674. </pre></font>
  675. C++ allows you to provide an <i>initializer</i> for a newly 
  676. created object as in:<br>
  677. <font size=2><br></font><font size=11><pre>
  678. float *thingPtr = new float ( 3.14159 ); <p>
  679. </pre></font>
  680. which initializes a newly created <b>float</b> object to 
  681. <b>3.14159</b>.<br>
  682.  
  683. </page>
  684. <page>
  685. A 10-element integer array can be created and assigned 
  686. to <b>arrayPtr</b> as follows:<br>
  687. <font size=2><br></font><font size=11><pre>
  688. int *arrayPtr = new int[ 10 ];<p>
  689. </pre></font>
  690. This array can be deleted with the statement<br>
  691. <font size=2><br></font><font size=11><pre>
  692. delete [] arrayPtr;<p>
  693. </pre></font>
  694. As we will see, <a href="^Errors::c:s0p7"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>using  <b>new</b> and <b>delete</b> instead of <b>malloc 
  695. </b>and <b>free</b> offers other benefits as well. In particular, <b>new</b> 
  696. automatically <a href="^Errors::c:s0p9"> <img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>invokes the constructor, and <b>delete</b> 
  697. automatically <a href="^Practice::c:s0p2"> <img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>invokes the class's destructor.<br>
  698.  
  699. </page>
  700. <page>
  701. <b>Select the true statement(s). </b><br>
  702. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  703. Operator new automatically creates an object of the proper size, calls the constructor, and returns a pointer of the proper type.  <br>
  704. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. 0 is returned.">
  705. If new cannot allocate the space for an object, -1 is returned.   <br>
  706. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. Operator delete is used to deallocate the memory allocated by new.">
  707. Operator free is used to deallocate memory allocated by new. <br>
  708. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. delete does automatically invoke the destructor for an object.">
  709. delete does not automatically invoke the destructor for an object. <br>
  710. <component type=button name=b label="Check Your Answer" width=125 height=24>
  711.  
  712. </page>
  713. </section>
  714. <section type=Body name=Default title="7.7 static Class Members">
  715. <page>
  716. <font size=18 bold>7.7 <b>static</b> Class Members</font><hr>
  717. Each object of a class has its own copy of all the data 
  718. members of the class. In certain cases only one copy of 
  719. a variable should be shared by all objects of a class. A 
  720. <tt><b>static</b></tt> class variable is used for these and other reasons. 
  721. A <b>static</b> class variable represents "class-wide" 
  722. information. The declaration of a <b>static</b> member begins 
  723. with the keyword <b>static</b>.<br>
  724. <spacer width=16 height=1>Let us motivate the need for <b>static</b> class-wide data with 
  725. a video game example. Suppose we have a video game 
  726. with <b>Martian</b>s and other space creatures. Each 
  727. <b>Martian</b> tends to be brave and willing to attack other <br>
  728.  
  729. </page>
  730. <page>
  731. space creatures when the <b>Martian</b> is aware that there 
  732. are at least 5 <b>Martian</b>s present. If there are fewer than 
  733. five <b>Martian</b>s present, each <b>Martian</b> becomes 
  734. cowardly. So each <b>Martian</b> needs to know the 
  735. <b>martianCount</b>. We could endow class <b>Martian</b> with 
  736. <b>martianCount </b>as a data member. If we do this, then 
  737. every <b>Martian</b> will have a separate copy of the data 
  738. member and every time we create a new <b>Martian</b> we 
  739. will have to update the data member <b>martianCount</b> in 
  740. every <b>Martian</b>. This wastes space with the redundant 
  741. copies and wastes time in updating the separate copies. 
  742. Instead, we declare <b>martianCount</b> to be <b>static</b>. This 
  743. makes <b>martianCount</b> class-wide data. Every <b>Martian</b> <br>
  744.  
  745. </page>
  746. <page>
  747. can see the <b>martianCount</b> as if it were a data member 
  748. of the <b>Martian</b>, but only one copy of the static 
  749. <b>martianCount</b> is maintained by C++. This saves space. 
  750. We save time by having the <b>Martian</b> constructor 
  751. increment the static <b>martianCount</b>. Because there is 
  752. only one copy, we do not have to increment separate 
  753. copies of <b>martianCount</b> for each <b>Martian</b> object.<br>
  754. <spacer width=16 height=1>Although <b>static</b>  <a href="^Perform::c:s0p6"><img src="bckgrnds/icons/perf_ico.gif" align=sidebar></a>data members may seem like global 
  755. variables, <b>static </b>data members have class scope. <b>static</b> 
  756. members can be <b>public</b>, <b>private</b> or <b>protected</b>. <b>static</b> 
  757. data members <i>must</i> be initialized <i>once</i> (and only once) 
  758. at file scope. A class's <b>public static</b> class members can 
  759. be accessed through any object of that class, or they can <br>
  760.  
  761. </page>
  762. <page>
  763. be accessed through the class name using the binary 
  764. scope resolution operator. A class's <b>private </b>and 
  765. <b>protected static</b> members must be accessed through 
  766. <b>public</b> member functions of the class or through 
  767. <b>friends</b> of the class. A class's <tt><b>static</b></tt> members exist 
  768. even when no objects of that class exist. To access a 
  769. <tt><b>public static</b></tt> class member when no objects of the class 
  770. exist, simply prefix the class name and the binary scope 
  771. resolution operator (<tt><b>::</b></tt>) to the name of the data member. 
  772. To access a <b>private</b> or <b>protected static</b> class member 
  773. when no objects of the class exist, a <b>public static</b> 
  774. member function must be provided and the function <br>
  775.  
  776. </page>
  777. <page>
  778. must be called by prefixing its name with the class 
  779. name and binary scope resolution operator.<br>
  780. <spacer width=16 height=1>The program of  <a href="^Code::c:s0p8"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.9</a> demonstrates the use of a 
  781. <tt><b>private static </b></tt>data member and a <tt><b>public static</b></tt> member 
  782. function. The data<a href="^Errors::c:s0p11"> <img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>member count is initialized to zero 
  783. at file scope with the statement<br>
  784. <font size=2><br></font><font size=11><pre>
  785. int Employee::count = 0;<p>
  786. </pre></font>
  787. Data member <b>count</b> maintains a count of the number of 
  788. objects of class <b>Employee</b> that have been instantiated. 
  789. When objects of class <b>Employee</b> exist, member <b>count</b> 
  790. can be referenced through any member function of an 
  791. <b>Employee</b> object--in this example, <b>count</b> is referenced 
  792. by both the constructor and the destructor. <br>
  793.  
  794. </page>
  795. <page>
  796. When no objects of class <b>Employee</b> exist, member 
  797. <b>count</b> can still be referenced, but only through a call to 
  798. <tt><b>static</b></tt> member function <b>getCount</b> as follows:<br>
  799. <font size=2><br></font><font size=11><pre>
  800. Employee::getCount()<p>
  801. </pre></font>
  802. In this example, function <b>getCount</b> is used to determine 
  803. the number of <b>Employee</b> objects currently instantiated. 
  804. Note<a href="^Engineer::c:s0p18"> <img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>that when there are no objects instantiated in the 
  805. program, the <b>Employee::getCount()</b> function call is 
  806. issued. However, when there are objects instantiated 
  807. function <b>getCount</b> can be called through one of the 
  808. objects as shown in the statement at lines 98 and 99<br>
  809.  
  810. </page>
  811. <page>
  812. <font size=2><br></font><font size=11><pre>
  813. cout << "Number of employees after instantiation is "<p>
  814.      << e1Ptr->getCount();<p>
  815. </pre></font>
  816. Note that the calls <b>e2Ptr->getCount()</b> and 
  817. <b>Employee::getCount()</b> would work in the preceding 
  818. statement as well.<br>
  819. <spacer width=16 height=1>A member function may be declared <b>static</b> if it does not 
  820. access <a href="^Engineer::c:s0p19"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>non-<b>static</b> class data members and member 
  821. functions. Unlike non-<b>static </b>member functions, a <b>static</b> 
  822. member function has no <b>this</b> <a href="^Errors::c:s0p12"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>pointer because <b>static</b> data 
  823. members and <b>static</b> <a href="^Errors::c:s0p13"><img src="bckgrnds/icons/cpe_ico.gif" align=sidebar></a>member functions exist 
  824. independent of any objects of a class.<br>
  825.  
  826. </page>
  827. <page>
  828. Lines 94 and 95 use operator <b>new</b> to dynamically 
  829. allocate two <b>Employee</b> objects. When each <b>Employee</b> 
  830. object is allocated, its constructor is called. When 
  831. <b>delete</b> is used at lines 107 and 109 to deallocate the two 
  832. <b>Employee</b> objects, their  <a href="^Practice::c:s0p3"><img src="bckgrnds/icons/gpp_ico.gif" align=sidebar></a>destructors are called.<br>
  833. <spacer width=16 height=1>Note the use of <b><i>assert </i></b>in the <b>Employee</b> constructor 
  834. function. The <b>assert</b> "macro"--defined in the <b>assert.h</b> 
  835. header file--tests the value of a condition. If the value 
  836. of the expression is <b>false</b>, then <b>assert</b> issues an error 
  837. message and calls function <b><i>abort</i></b> (of the general utilities 
  838. header file--<b>stdlib.h</b>) to terminate program execution. 
  839. This is a useful debugging tool for testing if a variable 
  840. has a correct value. In this program, <b>assert</b> determines <br>
  841.  
  842. </page>
  843. <page>
  844. if the <b>new</b> operator was able to fulfill the request for 
  845. memory to be allocated dynamically. For example, in 
  846. the <b>Employee</b> constructor function, the following line 
  847. (which is also called an <b>assertion</b>)<br>
  848. <font size=2><br></font><font size=11><pre>
  849. assert( firstName != 0 );<p>
  850. </pre></font>
  851. tests pointer <b>firstName</b> to determine if it is not equal to 
  852. <b>0</b>. If the condition in the preceding assertion is <b>true</b>, the 
  853. program continues without interruption. If the condition 
  854. in the preceding assertion is <b>false</b>, an error message 
  855. containing the line number, the condition being tested, 
  856. and the file name in which the assertion appears is 
  857. printed, and the program terminates. The programmer 
  858. may then concentrate on this area of the code to find the <br>
  859.  
  860. </page>
  861. <page>
  862. error. In Chapter 13, "Exception Handling," we will 
  863. provide a better method of dealing with execution time 
  864. errors.<br>
  865. <spacer width=16 height=1>Assertions do not have to be removed from the program 
  866. when debugging is completed. When assertions are no 
  867. longer needed for debugging purposes in a program, the 
  868. line<br>
  869. <font size=2><br></font><font size=11><pre>
  870. #define NDEBUG<p>
  871. </pre></font>
  872. is inserted at the beginning of the program file. This 
  873. causes the preprocessor to ignore all assertions instead 
  874. of the programmer having to delete each assertion 
  875. manually.<br>
  876.  
  877. </page>
  878. <page>
  879. Note that the implementations of functions 
  880. <b>getFirstName </b>and <b>getLastName</b> return to the client of 
  881. the class constant character pointers. In this 
  882. implementation, if the client wishes to retain a copy of 
  883. the first name or last name, the client is responsible for 
  884. copying the dynamically allocated memory in the 
  885. <b>Employee</b> object after obtaining the constant character 
  886. pointer from the object. Note that it is also possible to 
  887. implement <b>getFirstName</b> and <b>getLastName</b> so the 
  888. client is required to pass a character array and the size 
  889. of the array to each function. Then, the functions could 
  890. copy the first or last name into the character array 
  891. provided by the client.<br>
  892.  
  893. </page>
  894. <page>
  895. <b>Select the true statement(s). </b><br>
  896. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  897. static members are shared by all instances of a class.  <br>
  898. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  899. static members can be designated public, protected, or private.  <br>
  900. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. A class's static members exist from the beginning of program execution. ">
  901. A class's static members only exist when an object of the class exists.   <br>
  902. <component type=button name=b label="Check Your Answer" width=125 height=24>
  903.  
  904. </page>
  905. </section>
  906. <section type=Body name=Default title="7.8 Data Abstraction and Information Hiding">
  907. <page>
  908. <font size=18 bold>7.8 Data Abstraction and Information Hiding</font><hr>
  909. Classes normally hide their implementation details 
  910. from the clients of the classes. This is called 
  911. information hiding. As an example of information 
  912. hiding, let us consider a data structure called a <i>stack</i>. <br>
  913. <spacer width=16 height=1>Think of a stack in terms of a pile of dishes. When a 
  914. dish is placed on the pile, it is always placed at the top 
  915. (referred to as <i>pushing onto the stack</i>), and when a dish 
  916. is removed from the pile, it is always removed from the 
  917. top (referred to as <i>popping off the stack</i>). Stacks are 
  918. known as <i>last-in, first-out (LIFO) data structures</i>--the <br>
  919.  
  920. </page>
  921. <page>
  922. last item pushed (inserted) on the stack is the first item 
  923. popped (removed) from the stack. <br>
  924. <spacer width=16 height=1>The programmer may create a stack class and hide from 
  925. its clients the implementation of the stack. Stacks can 
  926. easily be implemented with arrays (or linked lists; see 
  927. Chapter 15, "Data Structures"). A client of a stack class 
  928. need not know how the stack is implemented. The 
  929. client simply requires that when data items are placed in 
  930. the stack, the data items will be recalled in last-in, first-
  931. out order. Describing the functionality of a class 
  932. independent of its implementation is called <i>data 
  933. abstraction and C++ classes define so-called abstract 
  934. data types (ADTs)</i>. Although users may happen to know <br>
  935.  
  936. </page>
  937. <page>
  938. the details of how a class is implemented, users should 
  939. not write code that depends on these details. This means 
  940. that the implementation of a particular class (such as 
  941. one that implements a stack and its operations of <i>push 
  942. and pop</i>) can be altered or replaced without affecting 
  943. the rest of the system, as long as the <b>public</b> interface to 
  944. that class does not change. <br>
  945. <spacer width=16 height=1>The job of a high-level language is to create a view 
  946. convenient for programmers to use. There is no single 
  947. accepted standard view--that is one reason why there 
  948. are so many programming languages. Object-oriented 
  949. programming in C++ presents yet another view.<br>
  950.  
  951. </page>
  952. <page>
  953. Most programming languages emphasize actions. In 
  954. these languages, data exists in support of the actions 
  955. programs need to take. Data is viewed as being "less 
  956. interesting" than actions, anyway. Data is "crude." 
  957. There are only a few built-in data types, and it is 
  958. difficult for programmers to create their own new data 
  959. types.<br>
  960. <spacer width=16 height=1>This view changes with C++ and the object-oriented 
  961. style of programming. C++ elevates the importance of 
  962. data. The primary activity in C++ is creating new data 
  963. types (i.e., classes) and expressing the interactions 
  964. among objects of those data types.<br>
  965.  
  966. </page>
  967. <page>
  968. To move in this direction, the programming-languages 
  969. community needed to formalize some notions about 
  970. data. The formalization we consider is the notion of 
  971. abstract data types (ADTs). ADTs receive as much 
  972. attention today as structured programming did over the 
  973. last two decades. ADTs do not replace structured 
  974. programming. Rather, they provide an additional 
  975. formalization that can further improve the program 
  976. development process.<br>
  977. <spacer width=16 height=1>What is an abstract data type? Consider the built-in type 
  978. <b>int</b>. What comes to mind is the notion of an integer in 
  979. mathematics, but <b>int</b> on a computer is not precisely 
  980. what an integer is in mathematics. In particular, <br>
  981.  
  982. </page>
  983. <page>
  984. computer <b>int</b>s are normally quite limited in size. For 
  985. example, <b>int</b> on a 32-bit machine may be limited 
  986. approximately to the range 2 billion to +2 billion. If 
  987. the result of a calculation falls outside this range, an 
  988. "overflow" error occurs and the machine responds in 
  989. some machine-dependent manner, including the 
  990. possibility of "quietly" producing an incorrect result. 
  991. Mathematical integers do not have this problem. So the 
  992. notion of a computer <b>int</b> is really only an 
  993. approximation to the notion of a real-world integer. The 
  994. same is true with <b>float</b>. <br>
  995. <spacer width=16 height=1>Even <b>char</b> is an approximation; <b>char</b> values are 
  996. normally 8-bit patterns of ones and zeros; these patterns <br>
  997.  
  998. </page>
  999. <page>
  1000. look nothing like the characters they represent such as a 
  1001. capital <b>Z</b>, a lowercase <b>z</b>, a dollar sign (<b>$</b>), a digit (<b>5</b>), 
  1002. and so on. Values of type <b>char</b> on most computers are 
  1003. quite limited compared to the range of real-world 
  1004. characters. The 7-bit ASCII character set provides for 
  1005. 128 different character values. This is completely 
  1006. inadequate for representing languages such as Japanese 
  1007. and Chinese that require thousands of characters.<br>
  1008. <spacer width=16 height=1>The point is that even the built-in data types provided 
  1009. with programming languages like C++ are really only 
  1010. approximations or models of real-world concepts and 
  1011. behaviors. We have taken <b>int</b> for granted until this 
  1012. point, but now you have a new perspective to consider. <br>
  1013.  
  1014. </page>
  1015. <page>
  1016. Types like <b>int</b>, <b>float</b>, <b>char</b> and others are all examples 
  1017. of abstract data types. They are essentially ways of 
  1018. representing real-world notions to some satisfactory 
  1019. level of precision within a computer system.<br>
  1020. <spacer width=16 height=1>An abstract data type actually captures two notions, 
  1021. namely a <i>data representation</i> and the <i>operations</i> that 
  1022. are allowed on that data. For example, the notion of <b>int</b> 
  1023. defines addition, subtraction, multiplication, division, 
  1024. and modulus operations in C++, but division by zero is 
  1025. undefined; and these allowed operations perform in a 
  1026. manner sensitive to machine parameters such as the 
  1027. fixed-word size of the underlying computer system. 
  1028. Another example is the notion of negative integers <br>
  1029.  
  1030. </page>
  1031. <page>
  1032. whose operations and data representation are clear, but 
  1033. the operation of taking the square root of a negative 
  1034. integer is undefined. In C++, the programmer uses 
  1035. classes to implement abstract data types. We create our 
  1036. own stack class in Chapter 12, "Templates," and we 
  1037. study the standard library <b>stack</b> class in Chapter 20, 
  1038. "Standard Template Library (STL)."<br>
  1039.  
  1040. </page>
  1041. <page>
  1042. <b>Select the true statement(s). </b><br>
  1043. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1044. Information hiding is a process by which a class's data implementation is hidden from the clients of the class.  <br>
  1045. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1046. The primary activity in C++ is creating objects from abstract data types and expressing interactions between those objects.  <br>
  1047. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1048.  
  1049. </page>
  1050. <page pagename="7.8.1 Example: Array Abstract Data Type">
  1051. <b>7.8.1 Example: Array Abstract Data Type</b><br>
  1052. We discussed arrays in Chapter 4. An array is not much 
  1053. more than a pointer and some space. This primitive 
  1054. capability is acceptable for performing array operations 
  1055. if the programmer is cautious and undemanding. There 
  1056. are many operations that would be nice to perform with 
  1057. arrays, but that are not built into  <a href="^Engineer::c:s0p20"><img src="bckgrnds/icons/seo_ico.gif" align=sidebar></a>C++. With C++ 
  1058. classes, the programmer can develop an array ADT that 
  1059. is preferable to "raw" arrays. The array class can 
  1060. provide many helpful new capabilities such as<br>
  1061. <indent width=8 delay>*   Subscript range checking.</indent>
  1062. <indent width=8 delay>*   An arbitrary range of subscripts instead of having to 
  1063. start with 0.</indent>
  1064.  
  1065. </page>
  1066. <page pagename="7.8.1 Example: Array Abstract Data Type">
  1067. <indent width=8 delay>*   Array assignment.</indent>
  1068. <indent width=8 delay>*   Array comparison.</indent>
  1069. <indent width=8 delay>*   Array input/output.</indent>
  1070. <indent width=8 delay>*   Arrays that know their sizes.</indent>
  1071. We create our own array class in Chapter 8, "Operator 
  1072. Overloading," and we study the standard library class 
  1073. (called <tt><b>vector</b></tt>) in Chapter 20.<br>
  1074. <spacer width=16 height=1>C++ has a small set of built-in types. Classes extend the 
  1075. base programming language. <br>
  1076. <spacer width=16 height=1>New classes created in C++ environments can be 
  1077. proprietary to an individual, to small groups, or to 
  1078. companies. Classes can also be placed in standard class 
  1079. libraries intended for wide distribution. This does not <br>
  1080.  
  1081. </page>
  1082. <page pagename="7.8.1 Example: Array Abstract Data Type">
  1083. necessarily promote standards although de facto 
  1084. standards are emerging. The full value of C++ will be 
  1085. realized only when substantial and standardized class 
  1086. libraries become widely available. In the United States, 
  1087. such standardization is proceeding through ANSI, the 
  1088. American National Standards Institute. ANSI and ISO 
  1089. (the International Standards Organization) are currently 
  1090. developing a standard version of C++ which, at the time 
  1091. of this writing, is close to final approval. The reader 
  1092. who learns C++ and object-oriented programming will 
  1093. be ready to take advantage of the new kinds of rapid, 
  1094. component-oriented software development made 
  1095. possible with increasingly abundant and rich libraries.<br>
  1096.  
  1097. </page>
  1098. <page pagename="7.8.2  Example: String Abstract Data Type">
  1099. <b>7.8.2  Example: String Abstract Data Type</b><br>
  1100. C++ is an intentionally sparse language that provides 
  1101. programmers with only the raw capabilities needed to 
  1102. build a broad range of systems. The language is 
  1103. designed to minimize performance burdens. C++ is 
  1104. appropriate for both applications programming and 
  1105. systems programming--the latter places extraordinary 
  1106. performance demands on programs. Certainly, it would 
  1107. have been possible to include a string data type among 
  1108. C++'s built-in data types. Instead, the language was 
  1109. designed to include mechanisms for creating and 
  1110. implementing string abstract data types through classes. 
  1111. We will develop our own string ADT in Chapter 8. The <br>
  1112.  
  1113. </page>
  1114. <page pagename="7.8.2  Example: String Abstract Data Type">
  1115. ANSI/ISO draft standard includes a <tt><b>string</b></tt> class that we 
  1116. discuss in detail in Chapter 19.<br>
  1117.  
  1118. </page>
  1119. <page pagename="7.8.3   Example: Queue Abstract Data Type">
  1120. <b>7.8.3   Example: Queue Abstract Data Type</b><br>
  1121. Each of us stands in line from time to time. A waiting 
  1122. line is also called a <i>queue</i>. We wait in line at the 
  1123. supermarket checkout counter, we wait in line to get 
  1124. gasoline, we wait in line to board a bus, we wait in line 
  1125. to pay a toll on the highway, and students know all too 
  1126. well about waiting in line during registration to get the 
  1127. courses they want. Computer systems use many waiting 
  1128. lines internally, so we need to write programs that 
  1129. simulate what queues are and do. <br>
  1130. <spacer width=16 height=1>A queue is a good example of an abstract data type. A 
  1131. queue offers well-understood behavior to its clients. 
  1132. Clients put things in a queue one at a time--using an <br>
  1133.  
  1134. </page>
  1135. <page pagename="7.8.3   Example: Queue Abstract Data Type">
  1136. <i>enqueue</i> operation, and the clients get those things back 
  1137. one at a time on demand--using a <i>dequeue</i> operation. 
  1138. Conceptually, a queue can become infinitely long. A 
  1139. real queue, of course, is finite. Items are returned from a 
  1140. queue in <i>first-in, first-out (FIFO)</i> order--the first item 
  1141. inserted in the queue is the first item removed from the 
  1142. queue.<br>
  1143. <spacer width=16 height=1>The queue hides an internal data representation that 
  1144. somehow keeps track of the items currently waiting in 
  1145. line, and it offers a set of operations to its clients, 
  1146. namely <i>enqueue</i> and <i>dequeue</i>. The clients are not 
  1147. concerned about the implementation of the queue. 
  1148. Clients merely want the queue to operate "as <br>
  1149.  
  1150. </page>
  1151. <page pagename="7.8.3   Example: Queue Abstract Data Type">
  1152. advertised." When a client enqueues a new item, the 
  1153. queue should accept that item and place it internally in 
  1154. some kind of first-in, first-out data structure. When the 
  1155. client wants the next item from the front of the queue, 
  1156. the queue should remove the item from its internal 
  1157. representation and should deliver the item to the outside 
  1158. world (i.e., to the <i>client</i> of the queue) in FIFO order, 
  1159. i.e., the item that has been in the queue the longest 
  1160. should be the next one returned by the next <i>dequeue</i> 
  1161. operation.<br>
  1162. <spacer width=16 height=1>The queue ADT guarantees the integrity of its internal 
  1163. data structure. Clients may not manipulate this data 
  1164. structure directly. Only the queue ADT has access to its <br>
  1165.  
  1166. </page>
  1167. <page pagename="7.8.3   Example: Queue Abstract Data Type">
  1168. internal data. Clients may cause only allowable 
  1169. operations to be performed on the data representation; 
  1170. operations not provided in the ADT's <b>public</b> interface 
  1171. are rejected by the ADT in some appropriate manner. 
  1172. This could mean issuing an error message, terminating 
  1173. execution, or simply ignoring the operation request.<br>
  1174. <spacer width=16 height=1>We create our own queue class in Chapter 15, "Data 
  1175. Structures," and we study the standard library <tt><b>queue</b></tt> 
  1176. class in Chapter 20.<br>
  1177.  
  1178. </page>
  1179. </section>
  1180. <section type=Body name=Default title="7.9 Container Classes and Iterators">
  1181. <page>
  1182. <font size=18 bold>7.9 Container Classes and Iterators</font><hr>
  1183. Among the most popular types of classes are <i>container 
  1184. classes</i> (also called <i>collection classes</i>), i.e., classes 
  1185. designed to hold collections of objects. Container 
  1186. classes commonly provide services such as insertion, 
  1187. deletion, searching, sorting, testing an item for 
  1188. membership in the class, and the like. Arrays, stacks, 
  1189. queues, trees and linked lists are examples of container 
  1190. classes; we studied arrays in Chapter 4 and we will 
  1191. study each of these other data structures in Chapters 15 
  1192. and 20.<br>
  1193.  
  1194. </page>
  1195. <page>
  1196. It is common to associate <i>iterator</i> objects--or more 
  1197. simply <i>iterators</i>--with container classes. An iterator is 
  1198. an object that returns the next item of a collection (or 
  1199. performs some action on the next item of a collection). 
  1200. Once an iterator for a class has been written, obtaining 
  1201. the next element from the class can be expressed 
  1202. simply. Iterators are normally written as <tt><b>friends</b></tt> of the 
  1203. classes for performance reasons; this enables iterators 
  1204. to have direct access to the <b>private</b> data of the classes 
  1205. through which they iterate. Just as a book being shared 
  1206. by several people could have several bookmarks in it at 
  1207. once, a container class can have several iterators 
  1208. operating on it at once. Each iterator maintains its own <br>
  1209.  
  1210. </page>
  1211. <page>
  1212. "position" information. We will discuss containers and 
  1213. iterators in great detail in Chapter 20, "Standard 
  1214. Template Library (STL)."<br>
  1215.  
  1216. </page>
  1217. <page>
  1218. <b>Select the true statement(s). </b><br>
  1219. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1220. Container classes are classes designed to hold collections of objects.  <br>
  1221. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. An iterator is an object that is used to access elements of a container.">
  1222. An iterator is a repetition structure used to execute statements in a program multiple times. <br>
  1223. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1224. Iterators are normally implemented as friends.  <br>
  1225. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1226.  
  1227. </page>
  1228. </section>
  1229. <section type=Body name=Default title="7.10 Proxy Classes">
  1230. <page>
  1231. <font size=18 bold>7.10 Proxy Classes</font><hr>
  1232. It is desirable to hide the implementation details of a 
  1233. class to prevent access to proprietary information 
  1234. (including <b>private</b> data) and proprietary program logic 
  1235. in a class. Providing clients of your class with a <i>proxy 
  1236. class</i> that knows only the <b>public</b> interface to your class 
  1237. enables the clients to use your class's services without 
  1238. giving the client access to your class's implementation 
  1239. details. <br>
  1240. <spacer width=16 height=1>Implementing a proxy class requires several steps (<a href="^Code::c:s0p9"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  1241. 7.10</a>). First, we create the class definition and 
  1242. implementation files for the class whose <b>private</b> data <br>
  1243.  
  1244. </page>
  1245. <page>
  1246. we would like to hide. Our example class, which we 
  1247. call <b>Implementation</b>, is shown in  <a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.10</a>, part 1. The 
  1248. proxy class <b>Interface</b> is shown in  <a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.10</a>, parts 2 and 
  1249. 3, and the test program and output are shown in <a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 
  1250. 7.10</a>, part 4.<br>
  1251. <spacer width=16 height=1>Class <b>Implementation</b> ( <a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.10</a>, part 1 of 4) provides 
  1252. a single <b>private</b> data member called <b>value</b> (this is the 
  1253. data we would like to hide from the client), a 
  1254. constructor to initialize <b>value</b>, and functions <b>setValue</b> 
  1255. and <b>getValue</b>. <br>
  1256. <spacer width=16 height=1>We create a proxy class definition with an identical 
  1257. <b>public </b>interface to that of class <b>Implementation</b>. The 
  1258. only <b>private</b> member of the proxy class is a pointer to <br>
  1259.  
  1260. </page>
  1261. <page>
  1262. an object of class <b>Implementation</b>. Using a pointer in 
  1263. this manner allows us to hide the implementation 
  1264. details of class <b>Implementation</b> from the client. <br>
  1265. <spacer width=16 height=1>Class <b>Interface</b> in part 2 of <a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.10</a> is the proxy class 
  1266. for class <tt><b>Implementation</b></tt>. Notice that the only 
  1267. mention in class <tt><b>Interface </b></tt>of the proprietary class 
  1268. <b>Implementation</b> is in the pointer declaration (line 23). 
  1269. When a class definition (such as class <b>Interface</b>) uses 
  1270. only a pointer to another class (such as to class 
  1271. <b>Implementation</b>), the class header file for that other 
  1272. class (which would ordinarily reveal the <b>private</b> data of 
  1273. that class) is not required to be included with <b>#include</b>. 
  1274. You can simply declare that other class as a data type <br>
  1275.  
  1276. </page>
  1277. <page>
  1278. with a <i>forward class declaration</i> (line 15) before the 
  1279. type is used in the file.<br>
  1280. <spacer width=16 height=1>The implementation file containing the member 
  1281. functions for proxy class <b>Interface</b> (<a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.10</a>, part 3) is 
  1282. the only file that includes the header file 
  1283. <tt><b>implementation.h </b></tt>containing class <b>Implementation</b> 
  1284. The file <b>interface.cpp</b> (<a href="^Code::c:s0p9"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.10</a>, part 3) is provided to 
  1285. the client as a precompiled object file along with the 
  1286. header file <b>interface.h</b> that includes the function 
  1287. prototypes of the services provided by the proxy class. 
  1288. Because file <b>interface.cpp</b> is made available to the 
  1289. client only as compiled object code, the client is not <br>
  1290.  
  1291. </page>
  1292. <page>
  1293. able to see the interactions between the proxy class and 
  1294. the proprietary class.<br>
  1295. <spacer width=16 height=1>The program in part 4 of<a href="^Code::c:s0p9"> <img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.10</a> tests class <b>Interface</b>. 
  1296. Notice that only the header file for class <b>Interface</b> is 
  1297. included in <b>main</b>--there is no mention of the existence 
  1298. of a separate class called <b>Implementation</b>. Thus, the 
  1299. client never sees the <b>private data</b> of class 
  1300. <b>Implementation</b>.<br>
  1301.  
  1302. </page>
  1303. <page>
  1304. <b>Select the true statement(s). </b><br>
  1305. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1306. A Proxy class provides client code with access to the public services of another class without allowing the client to see the data representation of the other class.  <br>
  1307. <component type="checkbox" width=20 height=18 label="" name=""  feedback="False. C++ does not contain a proxy keyword. The programmer must follow several steps in order to create a proxy class.">
  1308. Proxy classes are created with the proxy keyword.  <br>
  1309. <component type="checkbox" width=20 height=18 label="" name=""  correct="True.">
  1310. Proxy classes provide a means of hiding implementation details of another class. <br>
  1311. <component type=button name=b label="Check Your Answer" width=125 height=24>
  1312.  
  1313. </page>
  1314. </section>
  1315. <section type=Body name=Default title="7.11 Thinking About Objects: Using Composition and Dynamic Object Management in the Elevator Simulator">
  1316. <page>
  1317. <font size=18 bold>7.11 Thinking About Objects: Using Composition and Dynamic Object Management in the 
  1318. Elevator Simulator</font><hr>
  1319. In Chapters 2 through 5 you designed your elevator 
  1320. simulator and in Chapter 6 you began programming the 
  1321. simulator. In the body of Chapter 7, we discussed the 
  1322. remaining techniques that you will need to implement a 
  1323. complete, working elevator simulator. In particular, we 
  1324. discussed dynamic object management techniques that 
  1325. enable you to use <b>new</b> and <b>delete</b> to create and destroy 
  1326. objects as necessary as your simulator executes. We 
  1327. also discussed composition, a capability that allows you <br>
  1328.  
  1329. </page>
  1330. <page>
  1331. to create classes that have objects of other classes as 
  1332. members. Composition enables you to create a building 
  1333. class that contains the elevator and the floors, and, in 
  1334. turn, create an elevator class that contains a button, a 
  1335. door and a bell.<br>
  1336.  
  1337. </page>
  1338. </section>
  1339. <section type=Body name=Default title="7.12 Elevator Laboratory Assignment 6">
  1340. <page>
  1341. <font size=18 bold>7.12 Elevator Laboratory Assignment 6</font><hr>
  1342. Each time another person enters the simulator, use 
  1343. operator <b>new</b> to create a <b>Person</b> object to represent that 
  1344. person. Note that new invokes the constructor for the 
  1345. object being created, and, of course, the constructor 
  1346. should properly initialize the object. Each time a person 
  1347. leaves the simulator (after getting off the elevator) use <br>
  1348.  
  1349. </page>
  1350. <page>
  1351. 1. operator <b>delete t</b>o destroy the <b>Person</b> object and 
  1352. reclaim the storage occupied by that object; <b>delete</b> 
  1353. invokes the destructor for the object being destroyed.<br>
  1354. 2. Enumerate the composition relationships among the 
  1355. classes you have implemented for your elevator simulator. Modify the class definitions you created in the 
  1356. "Thinking About Objects" section in Chapter 6 to 
  1357. reflect these composition relationships.<br>
  1358. 3. Complete the implementation of a working simulator 
  1359. program. We will suggest enhancements to the elevator 
  1360. simulator in subsequent chapters.<br>
  1361.  
  1362. </page>
  1363. </section>
  1364. <section type=Body name=Default title="7.13 Summary">
  1365. <page>
  1366. <font size=18 bold>7.13 Summary</font><hr>
  1367. <indent width=8 delay>*   The keyword <b>const</b> specifies that an object is not 
  1368. modifiable.</indent>
  1369. <indent width=8 delay>*   The C++ compiler disallows non-<b>const</b> member 
  1370. function calls on <b>const</b> objects.</indent>
  1371. <indent width=8 delay>*   An attempt by a <b>const</b> member function of a class to 
  1372. modify an object of that class is a syntax error.</indent>
  1373. <indent width=8 delay>*   A function is specified as <b>const</b> both in its declaration and its definition.</indent>
  1374. <indent width=8 delay>*  A <b>const</b> member function may be overloaded with a 
  1375. non-<b>const </b>version. The choice of which overloaded 
  1376. member function to use is made by the compiler based </indent>
  1377.  
  1378. </page>
  1379. <page>
  1380. <indent width=8 delay>*   on whether the object has been declared <b>const</b> or not.</indent>
  1381. <indent width=8 delay>*   A <b>const</b> object must be initialized--member initializers must be provided in the constructor of a class when 
  1382. that class contains <b>const</b> data members.</indent>
  1383. <indent width=8 delay>*   Classes can be composed of objects of other classes.</indent>
  1384. <indent width=8 delay>*   Member objects are constructed in the order in which 
  1385. they are listed in the class definition and before their 
  1386. enclosing class objects are constructed.</indent>
  1387. <indent width=8 delay>*   If a member initializer is not provided for a member 
  1388. object, the member object's default constructor is 
  1389. called. </indent>
  1390. <indent width=8 delay>*  A <b>friend</b> function of a class is a function defined outside that class and that has the right to access all mem</indent>
  1391.  
  1392. </page>
  1393. <page>
  1394. <indent width=8 delay>*   bers of the class. </indent>
  1395. <indent width=8 delay>*   Friendship declarations can be placed anywhere in 
  1396. the class definition.</indent>
  1397. <indent width=8 delay>*   The <b>this</b> pointer is implicitly used to reference both 
  1398. the member functions and data members of the object.</indent>
  1399. <indent width=8 delay>*   Each object has access to its own address by using 
  1400. the <b>this</b> keyword. </indent>
  1401. <indent width=8 delay>*   The <b>this</b> pointer may be used explicitly.</indent>
  1402. <indent width=8 delay>*   The <b>new </b>operator automatically creates an object of 
  1403. the proper size, runs the object's constructor and returns 
  1404. a pointer of the correct type. To free the space for this 
  1405. object, use the <b>delete</b> operator.</indent>
  1406. <indent width=8 delay>*  An array of objects can be allocated dynamically </indent>
  1407.  
  1408. </page>
  1409. <page>
  1410. <indent width=8 delay>*   with <b>new</b> as in</indent>
  1411. <font size=2><br></font><font size=11><pre>
  1412. int *ptr = new int[100];<p>
  1413. </pre></font>
  1414. which allocates an array of 100 integers and assigns the 
  1415. starting location of the array to <b>ptr</b>. The preceding array 
  1416. of integers can be deleted with the statement<br>
  1417. <font size=2><br></font><font size=11><pre>
  1418. delete [] ptr;<p>
  1419. </pre></font>
  1420. <indent width=8 delay>*   A <b>static</b> data member represents "class-wide" information. The declaration of a <b>static</b> member begins with 
  1421. the keyword <b>static</b>.</indent>
  1422. <indent width=8 delay>*   <b>static</b> data members have class scope. </indent>
  1423. <indent width=8 delay>*  <b>static</b> members of a class can be accessed through an 
  1424. object of that class or through the class name using the </indent>
  1425.  
  1426. </page>
  1427. <page>
  1428. <indent width=8 delay>*   scope resolution operator (if the member is <b>public</b>).</indent>
  1429. <indent width=8 delay>*   A member function may be declared <b>static</b> if it does 
  1430. not access non-<b>static</b> class members. Unlike non-<b>static</b> 
  1431. member functions, a <b>static</b> member function has no <b>this</b> 
  1432. pointer. This is because <b>static</b> data members and <b>static</b> 
  1433. member functions exist independent of any objects of a 
  1434. class.</indent>
  1435. <indent width=8 delay>*   Classes normally hide their implementation details 
  1436. from the clients of the classes. This is called information hiding. </indent>
  1437. <indent width=8 delay>*   Stacks are known as last-in, first-out (LIFO) data 
  1438. structures--the last item pushed (inserted) on the stack 
  1439. is the first item popped (removed) from the stack. </indent>
  1440.  
  1441. </page>
  1442. <page>
  1443. <indent width=8 delay>*   Describing the functionality of a class independent of 
  1444. its implementation is called data abstraction and C++ 
  1445. classes define so-called abstract data types (ADTs). </indent>
  1446. <indent width=8 delay>*   C++ elevates the importance of data. The primary 
  1447. activity in C++ is creating new data types (i.e., classes) 
  1448. and expressing the interactions among objects of those 
  1449. data types.</indent>
  1450. <indent width=8 delay>*   Abstract data types are ways of representing real-
  1451. world notions to some satisfactory level of precision 
  1452. within a computer system.</indent>
  1453. <indent width=8 delay>*   An abstract data type actually captures two notions, 
  1454. namely a <i>data representation and the operations</i> that 
  1455. are allowed on that data.</indent>
  1456.  
  1457. </page>
  1458. <page>
  1459. <indent width=8 delay>*   C++ is an extensible language. Although the language is easy to extend with these new types, the base 
  1460. language itself is not changeable.</indent>
  1461. <indent width=8 delay>*   C++ is an intentionally sparse language that provides 
  1462. programmers with only the raw capabilities needed to 
  1463. build a broad range of systems. The language is 
  1464. designed to minimize performance burdens. </indent>
  1465. <indent width=8 delay>*   Items are returned from a queue in first-in, first-out 
  1466. (FIFO) order--the first item inserted in the queue is the 
  1467. first item removed from the queue.</indent>
  1468. <indent width=8 delay>*  Container classes (also called collection classes) are 
  1469. designed to hold collections of objects. Container 
  1470. classes commonly provide services such as insertion, </indent>
  1471.  
  1472. </page>
  1473. <page>
  1474. <indent width=8 delay>*   deletion, searching, sorting, testing an item for membership in the class, and the like.</indent>
  1475. <indent width=8 delay>*   It is common to associate iterator objects--or more 
  1476. simply iterators--with container classes. An iterator is 
  1477. an object that returns the next item of a collection (or 
  1478. performs some action on the next item of a collection). </indent>
  1479. <indent width=8 delay>*   Providing clients of your class with a proxy class that 
  1480. knows only the <b>public</b> interface to your class enables 
  1481. the clients to use your class's services without giving 
  1482. the client access to your class's implementation details.</indent>
  1483. <indent width=8 delay>*   The only <b>private</b> member of the proxy class is a 
  1484. pointer to an object of the class whose <b>private</b> data we 
  1485. would like to hide. </indent>
  1486.  
  1487. </page>
  1488. <page>
  1489. <indent width=8 delay>*   When a class definition uses only a pointer to another 
  1490. class, the class header file for that other class (which 
  1491. would ordinarily reveal the <b>private</b> data of that class) is 
  1492. not required to be included with <b>#include</b>. You can 
  1493. simply declare that other class as a data type with a forward class declaration before the type is used in the file.</indent>
  1494. <indent width=8 delay>*   The implementation file containing the member 
  1495. functions for the proxy class is the only file that 
  1496. includes the header file for the class whose <b>private</b> data 
  1497. we would like to hide. </indent>
  1498. <indent width=8 delay>*  The implementation file is provided to the client as a 
  1499. precompiled object file along with the header file that 
  1500. includes the function prototypes of the services pro</indent>
  1501.  
  1502. </page>
  1503. <page>
  1504. <indent width=8 delay>*   vided by the proxy class. </indent>
  1505. <br>
  1506.  
  1507. </page>
  1508. </section>
  1509. <section type=Popup name=Debug title="Testing">
  1510. <page>
  1511. Always declare 
  1512. member functions 
  1513. <b>const</b> if they do not 
  1514. modify the object. This 
  1515. can help eliminate 
  1516. many bugs.<br>
  1517. <br>
  1518.  
  1519. </page>
  1520. <page>
  1521. Languages like C++ are 
  1522. "moving targets" as 
  1523. they evolve. More 
  1524. keywords are likely to 
  1525. be added to the 
  1526. language. Avoid using 
  1527. "loaded" words like 
  1528. "object" as identifiers. 
  1529. Even though "object" is 
  1530. not currently a keyword <br>
  1531.  
  1532. </page>
  1533. <page>
  1534. in C++, it could 
  1535. become one, so future 
  1536. compiling with new 
  1537. compilers could 
  1538. "break" existing code.<br>
  1539. <br>
  1540.  
  1541. </page>
  1542. </section>
  1543. <section type=Popup name=Terminology title="Terminology">
  1544. <page>
  1545. <font size=14>
  1546. A<br>
  1547. abstract data type 
  1548. <a href="%s8p1"><img src=iicons/bullbib.gif></a>
  1549.  
  1550. <a href="%s8p15"><img src=iicons/bullbib.gif></a>
  1551. <br>
  1552. B<br>
  1553. binary scope resolution 
  1554. operator (<b>::</b>) 
  1555. <a href="%s7p3"><img src=iicons/bullbib.gif></a>
  1556. <a href="%s7p3"><img src=iicons/bullbib.gif></a>
  1557. <br>
  1558. C<br>
  1559. cascaded member 
  1560. function calls 
  1561. <a href="%s5p4"><img src=iicons/bullbib.gif></a>
  1562. <br>
  1563. composition 
  1564. <a href="%s3p0"><img src=iicons/bullbib.gif></a>
  1565. <a href="%s11p0"><img src=iicons/bullbib.gif></a>
  1566. <br>
  1567. <b>const</b> member function 
  1568.  
  1569. <a href="%s2p0"><img src=iicons/bullbib.gif></a>
  1570. <br>
  1571. <b>const</b> object 
  1572. <a href="%s2p0"><img src=iicons/bullbib.gif></a>
  1573. <a href="%s2p4"><img src=iicons/bullbib.gif></a>
  1574. <a href="^Engineer::c:s0p6"><img src=iicons/bullbib.gif></a>
  1575. <br>
  1576. container class 
  1577. <a href="%s4p1"><img src=iicons/bullbib.gif></a>
  1578. <a href="%s9p0"><img src=iicons/bullbib.gif></a>
  1579. <br>
  1580. </font>
  1581.  
  1582. </page>
  1583. <page>
  1584. <font size=14>
  1585. D<br>
  1586. data representation 
  1587. <a href="%s8p7"><img src=iicons/bullbib.gif></a>
  1588. <br>
  1589. default constructor 
  1590. <a href="%s3p4"><img src=iicons/bullbib.gif></a>
  1591.  
  1592. <a href="^Errors::c:s0p5"><img src=iicons/bullbib.gif></a>
  1593. <br>
  1594. <b>delete</b> 
  1595. <a href="%s6p0"><img src=iicons/bullbib.gif></a>
  1596. <a href="^Errors::c:s0p7"><img src=iicons/bullbib.gif></a>
  1597. <a href="%s12p1"><img src=iicons/bullbib.gif></a>
  1598. <br>
  1599. <b>delete []</b> 
  1600. <a href="^Errors::c:s0p9"><img src=iicons/bullbib.gif></a>
  1601. <br>
  1602. dequeue 
  1603. <a href="%s8p16"><img src=iicons/bullbib.gif></a>
  1604. <br>
  1605. E<br>
  1606. enqueue 
  1607. <a href="%s8p16"><img src=iicons/bullbib.gif></a>
  1608. <br>
  1609. extensible language 
  1610. <a href="^Engineer::c:s0p20"><img src=iicons/bullbib.gif></a>
  1611. <br>
  1612. F<br>
  1613. first-in first-out (FIFO) 
  1614.  
  1615. <a href="%s8p16"><img src=iicons/bullbib.gif></a>
  1616. <br>
  1617. </font>
  1618.  
  1619. </page>
  1620. <page>
  1621. <font size=14>
  1622. forward class declaration 
  1623.  
  1624. <a href="%s10p3"><img src=iicons/bullbib.gif></a>
  1625. <br>
  1626. <b>friend</b> 
  1627. <a href="%s4p2"><img src=iicons/bullbib.gif></a>
  1628. <a href="%s9p1"><img src=iicons/bullbib.gif></a>
  1629. <br>
  1630. friend function 
  1631. <a href="%s4p0"><img src=iicons/bullbib.gif></a>
  1632. <br>
  1633. H<br>
  1634. host object 
  1635. <a href="%s3p1"><img src=iicons/bullbib.gif></a>
  1636. <br>
  1637. I<br>
  1638. iterator 
  1639. <a href="%s9p1"><img src=iicons/bullbib.gif></a>
  1640. <br>
  1641. L<br>
  1642. last-in first-out (LIFO) 
  1643.  
  1644. <a href="%s8p0"><img src=iicons/bullbib.gif></a>
  1645. <br>
  1646. M<br>
  1647. member initializer 
  1648. <a href="%s2p7"><img src=iicons/bullbib.gif></a>
  1649.  
  1650. <a href="^Engineer::c:s0p4"><img src=iicons/bullbib.gif></a>
  1651. <a href="^Engineer::c:s0p7"><img src=iicons/bullbib.gif></a>
  1652. <br>
  1653. </font>
  1654.  
  1655. </page>
  1656. <page>
  1657. <font size=14>
  1658. member object's default 
  1659. constructor 
  1660. <a href="%s3p4"><img src=iicons/bullbib.gif></a>
  1661. <a href="^Perform::c:s0p2"><img src=iicons/bullbib.gif></a>
  1662. <br>
  1663. member-access specifier 
  1664.  
  1665. <a href="^Practice::c:s0p1"><img src=iicons/bullbib.gif></a>
  1666. <br>
  1667. N<br>
  1668. <b>new</b> 
  1669. <a href="%s6p0"><img src=iicons/bullbib.gif></a>
  1670. <a href="%s11p0"><img src=iicons/bullbib.gif></a>
  1671. <a href="^Errors::c:s0p7"><img src=iicons/bullbib.gif></a>
  1672. <br>
  1673. O<br>
  1674. object-based 
  1675. programming (OBP) 
  1676. <a href="%s1p0"><img src=iicons/bullbib.gif></a>
  1677. <br>
  1678. P<br>
  1679. <b>pop</b> 
  1680. <a href="%s8p2"><img src=iicons/bullbib.gif></a>
  1681. <br>
  1682. principle of least 
  1683. privilege 
  1684. <a href="%s2p0"><img src=iicons/bullbib.gif></a>
  1685. <a href="^Engineer::c:s0p0"><img src=iicons/bullbib.gif></a>
  1686. <br>
  1687. proxy class 
  1688. <a href="%s10p0"><img src=iicons/bullbib.gif></a>
  1689. <br>
  1690. </font>
  1691.  
  1692. </page>
  1693. <page>
  1694. <font size=14>
  1695. <b>push</b> 
  1696. <a href="%s8p2"><img src=iicons/bullbib.gif></a>
  1697. <br>
  1698. Q<br>
  1699. queue 
  1700. <a href="%s8p15"><img src=iicons/bullbib.gif></a>
  1701. <a href="%s9p0"><img src=iicons/bullbib.gif></a>
  1702. <br>
  1703. S<br>
  1704. stack 
  1705. <a href="%s8p0"><img src=iicons/bullbib.gif></a>
  1706. <a href="%s9p0"><img src=iicons/bullbib.gif></a>
  1707. <br>
  1708. <b>static</b> data members 
  1709. <a href="^Perform::c:s0p6"><img src=iicons/bullbib.gif></a>
  1710. <br>
  1711. <b>static</b> member function 
  1712.  
  1713. <a href="%s7p5"><img src=iicons/bullbib.gif></a>
  1714. <a href="%s7p6"><img src=iicons/bullbib.gif></a>
  1715. <br>
  1716. T<br>
  1717. <b>this</b> pointer 
  1718. <a href="%s5p0"><img src=iicons/bullbib.gif></a>
  1719. <a href="%s7p6"><img src=iicons/bullbib.gif></a>
  1720. <br>
  1721. <br>
  1722. </font>
  1723.  
  1724. </page>
  1725. </section>
  1726. <section type=Popup name=Illustration title="Illustrations">
  1727. <page>
  1728. <a href="^Code::c:s0p0">Fig. 7.1</a>  Using a <b>Time</b> class with <b>const</b> objects and <b>const</b> member functions.<br>
  1729. <a href="^Code::c:s0p1">Fig. 7.2 </a> Using a member initializer to initialize a constant of a built-in data type.<br>
  1730. <a href="^Code::c:s0p2">Fig. 7.3</a>  Erroneous attempt to initialize a constant of a built-in data type by assignment.<br>
  1731. <a href="^Code::c:s0p3">Fig. 7.4</a>  Using member-object initializers.<br>
  1732. <a href="^Code::c:s0p4">Fig. 7.5</a>  Friends can access <b>private</b> members of a class.<br>
  1733. <a href="^Code::c:s0p5">Fig. 7.6</a>  Non-<b>friend</b>/non-member functions cannot access <b>private</b> class members.<br>
  1734. <a href="^Code::c:s0p6">Fig. 7.7</a>  Using the this pointer.<br>
  1735. <a href="^Code::c:s0p7">Fig. 7.8</a>  Cascading member function calls.<br>
  1736. <a href="^Code::c:s0p8">Fig. 7.9</a>  Using a <b>static</b> data member to maintain a count of the number of objects of a class.<br>
  1737. <a href="^Code::c:s0p9">Fig. 7.10</a>  Implementing a proxy class.<br>
  1738. <br>
  1739.  
  1740. </page>
  1741. </section>
  1742. <section type=Popup name=Exercises title="Exercises">
  1743. <page pagename="Exercise 7.1">
  1744. <b>Exercise 7.1</b><br>
  1745. Fill in the blanks in each of the following:<br>
  1746. a)  ________ syntax is used to initialize constant members of a class.<br>
  1747. b)  A nonmember function must be declared as a ________ of a class to have 
  1748. access to that class's <b>private</b> data members.<br>
  1749. c)  The ________ operator dynamically allocates memory for an object of a 
  1750. specified type and returns a ________ to that type.<br>
  1751. d)  A constant object must be ________; it cannot be modified after it is 
  1752. created.<br>
  1753. e)  A ________ data member represents class-wide information.<br>
  1754. f)  An object's member functions have access to a "self pointer" to the object 
  1755. called the ________ pointer.<br>
  1756. <foreign  name="answers" url="^Answers::c:s0p0">
  1757.  
  1758. </page>
  1759. <page pagename="Exercise 7.1">
  1760. g)  The keyword ________ specifies that an object or variable is not 
  1761. modifiable after it is initialized.<br>
  1762. h)  If a member initializer is not provided for a member object of a class, the 
  1763. object's ________ is called.<br>
  1764. i)  A member function can be declared <b>static</b> if it does not access ________ 
  1765. class members.<br>
  1766. j)  Member objects are constructed ________ their enclosing class object.<br>
  1767. k)  The ________ operator reclaims memory previously allocated by new.<br>
  1768. <foreign  name="answers" url="^Answers::c:s0p0">
  1769. <br>
  1770.  
  1771. </page>
  1772. <page pagename="Exercise 7.2">
  1773. <b>Exercise 7.2</b><br>
  1774. Find the error(s) in each of the following and explain how to correct it.<br>
  1775. <font size=2><br></font><font size=11><pre>
  1776. a)  class Example {<p>
  1777.     public:<p>
  1778.        Example( int y = 10 ) { data = y; }<p>
  1779.        int getIncrementedData() const { return ++data; }<p>
  1780.        static int getCount()<p>
  1781.        {<p>
  1782.           cout << "Data is " << data << endl;<p>
  1783.           return count;<p>
  1784.  }<p>
  1785. </pre></font>
  1786. <foreign  name="answers" url="^Answers::c:s0p2">
  1787.  
  1788. </page>
  1789. <page pagename="Exercise 7.2">
  1790. <font size=2><br></font><font size=11><pre>
  1791.            private:<p>
  1792. </pre></font>
  1793. <font size=2><br></font><font size=11><pre>
  1794.        int data;<p>
  1795.        static int count;<p>
  1796.     };<p>
  1797. b)  char *string;<p>
  1798.     string = new char[ 20 ];<p>
  1799.     free( string );<p>
  1800. </pre></font>
  1801. <foreign  name="answers" url="^Answers::c:s0p2">
  1802. <br>
  1803.  
  1804. </page>
  1805. <page pagename="Exercise 7.3">
  1806. <b>Exercise 7.3</b><br>
  1807. Compare and contrast dynamic memory allocation with the C++ operators <b>new</b> 
  1808. and <b>delete</b>, with dynamic memory allocation with the C Standard Library 
  1809. functions <b>malloc</b> and <b>free</b>.<br>
  1810. <br>
  1811.  
  1812. </page>
  1813. <page pagename="Exercise 7.4">
  1814. <b>Exercise 7.4</b><br>
  1815. Explain the notion of friendship in C++. Explain the negative aspects of 
  1816. friendship as described in the text.<br>
  1817. <br>
  1818.  
  1819. </page>
  1820. <page pagename="Exercise 7.5">
  1821. <b>Exercise 7.5</b><br>
  1822. Can a correct <b>Time</b> class definition include both of the following constructors? 
  1823. If not, explain why not.<br>
  1824. <font size=2><br></font><font size=11><pre>
  1825. Time ( int h = 0, int m = 0, int s = 0 );<p>
  1826. Time();<p>
  1827. </pre></font>
  1828. <br>
  1829.  
  1830. </page>
  1831. <page pagename="Exercise 7.6">
  1832. <b>Exercise 7.6</b><br>
  1833. What happens when a return type, even <b>void</b>, is specified for a constructor or 
  1834. destructor?<br>
  1835. <br>
  1836.  
  1837. </page>
  1838. <page pagename="Exercise 7.7">
  1839. <b>Exercise 7.7</b><br>
  1840. Create a <b>Date</b> class with the following capabilities:<br>
  1841. a)  Output the date in multiple formats such as <br>
  1842. DDD YYYY<p>
  1843. MM/DD/YY<p>
  1844. June 14, 1992<br>
  1845. b)  Use overloaded constructors to create <b>Date</b> objects initialized with dates of 
  1846. the formats in part (a).<br>
  1847. c)  Create a <b>Date</b> constructor that reads the system date using the standard 
  1848. library functions of the <b>time.h</b> header and sets the <b>Date</b> members.<br>
  1849. In Chapter 8, we will be able to create operators for testing the equality of two 
  1850. dates and for comparing dates to determine if one date is prior to, or after, 
  1851. another.<br>
  1852. <foreign  name="answers" url="^Answers::c:s0p4">
  1853.  
  1854. </page>
  1855. <page pagename="Exercise 7.8">
  1856. <b>Exercise 7.8</b><br>
  1857. Create a <b>SavingsAccount</b> class. Use a <b>static</b> data member to contain the 
  1858. <b>annualInterestRate</b> for each of the savers. Each member of the class contains a 
  1859. <b>private</b> data member <b>savingsBalance</b> indicating the amount the saver currently 
  1860. has on deposit. Provide a <b>calculateMonthlyInterest</b> member function that 
  1861. calculates the monthly interest by multiplying the <b>balance</b> by 
  1862. <b>annualInterestRate</b> divided by 12; this interest should be added to 
  1863. <b>savingsBalance</b>. Provide a <b>static</b> member function <b>modifyInterestRate</b> that 
  1864. sets the <b>static</b> <b>annualInterestRate</b> to a new value. Write a driver program to 
  1865. test class <b>SavingsAccount</b>. Instantiate two different <b>savingsAccount</b> objects, 
  1866. <b>saver1</b> and <b>saver2</b>, with balances of $2000.00 and $3000.00, respectively. Set 
  1867. <b>annualInterestRate</b> to 3%, then calculate the monthly interest and print the new<br>
  1868. <foreign  name="answers" url="^Answers::c:s0p5">
  1869.  
  1870. </page>
  1871. <page pagename="Exercise 7.8">
  1872. balances for each of the savers. Then set the <b>annualInterestRate</b> to 4% and 
  1873. calculate the next month's interest and print the new balances for each of the 
  1874. savers.<br>
  1875. <foreign  name="answers" url="^Answers::c:s0p5">
  1876. <br>
  1877.  
  1878. </page>
  1879. <page pagename="Exercise7.9">
  1880. <b>Exercise7.9</b><br>
  1881. Create a class called <b>IntegerSet</b>. Each object of class <b>IntegerSet</b> can hold 
  1882. integers in the range 0 through 100. A set is represented internally as an array of 
  1883. ones and zeros. Array element <b>a[ i ]</b> is 1 if integer <i>i</i> is in the set. Array element 
  1884. <b>a[ j ]</b> is 0 if integer <i>j</i> is not in the set. The default constructor initializes a set to 
  1885. the so-called "empty set," i.e., a set whose array representation contains all 
  1886. zeros. <br>
  1887. Provide member functions for the common set operations. For example, provide 
  1888. a <b>unionOfIntegerSets</b> member function that creates a third set which is the set-
  1889. theoretic union of two existing sets (i.e., an element of the third set's array is set 
  1890. to 1 if that element is 1 in either or both of the existing sets, and an element of 
  1891. the third set's array is set to 0 if that element is 0 in each of the existing sets).<br>
  1892.  
  1893. </page>
  1894. <page pagename="Exercise7.9">
  1895. Provide an <b>intersectionOfIntegerSets</b> member function that creates a third set 
  1896. which is the set-theoretic intersection of two existing sets (i.e., an element of the 
  1897. third set's array is set to 0 if that element is 0 in either or both of the existing 
  1898. sets, and an element of the third set's array is set to 1 if that element is 1 in each 
  1899. of the existing sets).<br>
  1900. Provide an <b>insertElement</b> member function that inserts a new integer <i>k</i> into a 
  1901. set (by setting <b>a[k]</b> to 1). Provide a <b>deleteElement</b> member function that deletes 
  1902. integer <i>m</i> (by setting <b>a[m]</b> to 0). <br>
  1903. Provide a <b>setPrint</b> member function that prints a set as a list of numbers 
  1904. separated by spaces. Print only those elements that are present in the set (i.e., 
  1905. their position in the array has a value of 1). Print --- for an empty set.<br>
  1906. Provide an <b>isEqualTo</b> member function that determines if two sets are equal.<br>
  1907.  
  1908. </page>
  1909. <page pagename="Exercise7.9">
  1910. Provide an additional constructor to take five integer arguments which can be 
  1911. used to initialize a set object. If you want to provide fewer than five elements in 
  1912. the set, use default arguments of <p>
  1913. -1 for the others.<br>
  1914. Now write a driver program to test your <b>IntegerSet</b> class. Instantiate several 
  1915. <b>IntegerSet</b> objects. Test that all your member functions work properly. <br>
  1916. <br>
  1917.  
  1918. </page>
  1919. <page pagename="Exercise 7.10">
  1920. <b>Exercise 7.10</b><br>
  1921. It would be perfectly reasonable for the <b>Time</b> class of  <a href="^Code::c:s0p7"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.8</a> to represent the 
  1922. time internally as the number of seconds since midnight rather than the three 
  1923. integer values hour, <b>minute</b> and <b>second</b>. Clients could use the same <b>public</b> 
  1924. methods and get the same results. Modify the <b>Time</b> class of  <a href="^Code::c:s0p7"><img src="bckgrnds/icons/code_ico.gif" align=sidebar>Fig. 7.8</a> to 
  1925. implement the <b>Time</b> as the number of seconds since midnight and show that 
  1926. there is no visible change in functionality to the clients of the class.<br>
  1927. <br>
  1928.  
  1929. </page>
  1930. </section>
  1931. <section type=Popup name=Objective title="Objectives">
  1932. <page>
  1933. <indent width=8 delay>*   To be able to create and destroy objects dynamically.</indent>
  1934. <indent width=8 delay>*   To be able to specify <b>const</b> (constant) objects and <b>const</b> member functions.</indent>
  1935. <indent width=8 delay>*   To understand the purpose of <b>friend</b> functions and friend classes.</indent>
  1936. <indent width=8 delay>*   To understand how to use <b>static</b> data members and member functions.</indent>
  1937. <foreign  name="audio" url="~audio/Ch07/07obj.au">
  1938.  
  1939. </page>
  1940. <page>
  1941. <indent width=8 delay>*   To understand the concept of a container class.</indent>
  1942. <indent width=8 delay>*   To understand the notion of iterator classes that walk through the elements of container classes.</indent>
  1943. <indent width=8 delay>*   To understand the use of the <b>this</b> pointer.</indent>
  1944.  
  1945. </page>
  1946. </section>
  1947. <section type=Popup name=Perform title="Performance">
  1948. <page>
  1949. Declaring variables and 
  1950. objects <b>const</b> is not 
  1951. only an effective 
  1952. software engineering 
  1953. practice--it can 
  1954. improve performance 
  1955. as well because today's 
  1956. sophisticated 
  1957. optimizing compilers 
  1958. can perform certain <br>
  1959.  
  1960. </page>
  1961. <page>
  1962. optimizations on 
  1963. constants that cannot be 
  1964. performed on variables.<br>
  1965. <br>
  1966.  
  1967. </page>
  1968. <page>
  1969. Initialize member 
  1970. objects explicitly 
  1971. through member 
  1972. initializers. This 
  1973. eliminates the overhead 
  1974. of "doubly initializing" 
  1975. member objects--once 
  1976. when the member 
  1977. object's default 
  1978. constructor is called <br>
  1979.  
  1980. </page>
  1981. <page>
  1982. and again when set 
  1983. functions are used to 
  1984. initialize the member 
  1985. object.<br>
  1986. <br>
  1987.  
  1988. </page>
  1989. <page>
  1990. For reasons of economy 
  1991. of storage, only one 
  1992. copy of each member 
  1993. function exists per 
  1994. class, and this member 
  1995. function is invoked by 
  1996. every object of that 
  1997. class. Each object, on 
  1998. the other hand, has its <br>
  1999.  
  2000. </page>
  2001. <page>
  2002. own copy of the class's 
  2003. data members.<br>
  2004. <br>
  2005.  
  2006. </page>
  2007. <page>
  2008. Use <tt><i><b>static</b></i></tt> data 
  2009. members to save 
  2010. storage when a single 
  2011. copy of the data will 
  2012. suffice.<br>
  2013. <br>
  2014.  
  2015. </page>
  2016. </section>
  2017. <section type=Popup name=Code title="Code Examples">
  2018. <page>
  2019. <font size=18>Figure 7.1  Using a <b>Time</b> class with <b>const</b> objects and <b>const</b> member functions.</font><br>
  2020. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2021. <param  name="file" value="code/ch07/fig07_01.txt">
  2022. </applet><br>
  2023. <br>
  2024. <foreign  name="copy2disk" url="!jcpy Source/fig07_01.jar">
  2025. <foreign  name="audio" url="~audio/Ch07/07fig001.au">
  2026. <br>
  2027.  
  2028. </page>
  2029. <page>
  2030. <font size=18>Figure 7.2  Using a member initializer to initialize a constant of a built-in data type.</font><br>
  2031. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2032. <param  name="file" value="code/ch07/fig07_02.txt">
  2033. </applet><br>
  2034. <br>
  2035. <foreign  name="copy2disk" url="!jcpy Source/fig07_02.jar">
  2036. <foreign  name="audio" url="~audio/Ch07/07fig002.au">
  2037. <foreign  name="execute" url="!jarexe Run/fig07_02.jar">
  2038. <br>
  2039.  
  2040. </page>
  2041. <page>
  2042. <font size=18>Figure 7.3  Erroneous attempt to initialize a constant of a built-in data type by 
  2043. assignment.</font><br>
  2044. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2045. <param  name="file" value="code/ch07/fig07_03.txt">
  2046. </applet><br>
  2047. <br>
  2048. <foreign  name="copy2disk" url="!jcpy Source/fig07_03.jar">
  2049. <foreign  name="audio" url="~audio/Ch07/07fig003.au">
  2050. <br>
  2051.  
  2052. </page>
  2053. <page>
  2054. <font size=18>Figure 7.4  Using member-object initializers.</font><br>
  2055. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2056. <param  name="file" value="code/ch07/fig07_04.txt">
  2057. </applet><br>
  2058. <br>
  2059. <foreign  name="copy2disk" url="!jcpy Source/fig07_04.jar">
  2060. <foreign  name="audio" url="~audio/Ch07/07fig004.au">
  2061. <foreign  name="execute" url="!jarexe Run/fig07_04.jar">
  2062. <br>
  2063.  
  2064. </page>
  2065. <page>
  2066. <font size=18>Figure 7.5  Friends can access <b>private</b> members of a class.</font><br>
  2067. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2068. <param  name="file" value="code/ch07/fig07_05.txt">
  2069. </applet><br>
  2070. <br>
  2071. <foreign  name="copy2disk" url="!jcpy Source/fig07_05.jar">
  2072. <foreign  name="audio" url="~audio/Ch07/07fig005.au">
  2073. <foreign  name="execute" url="!jarexe Run/fig07_05.jar">
  2074. <br>
  2075.  
  2076. </page>
  2077. <page>
  2078. <font size=18>Figure 7.6  Non-<b>friend</b>/non-member functions cannot access <b>private</b> class members.</font><br>
  2079. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2080. <param  name="file" value="code/ch07/fig07_06.txt">
  2081. </applet><br>
  2082. <br>
  2083. <foreign  name="copy2disk" url="!jcpy Source/fig07_06.jar">
  2084. <foreign  name="audio" url="~audio/Ch07/07fig006.au">
  2085. <br>
  2086.  
  2087. </page>
  2088. <page>
  2089. <font size=18>Figure 7.7  Using the this pointer.</font><br>
  2090. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2091. <param  name="file" value="code/ch07/fig07_07.txt">
  2092. </applet><br>
  2093. <br>
  2094. <foreign  name="copy2disk" url="!jcpy Source/fig07_07.jar">
  2095. <foreign  name="audio" url="~audio/Ch07/07fig007.au">
  2096. <foreign  name="execute" url="!jarexe Run/fig07_07.jar">
  2097. <br>
  2098.  
  2099. </page>
  2100. <page>
  2101. <font size=18>Figure 7.8  Cascading member function calls.</font><br>
  2102. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2103. <param  name="file" value="code/ch07/fig07_08.txt">
  2104. </applet><br>
  2105. <br>
  2106. <foreign  name="copy2disk" url="!jcpy Source/fig07_08.jar">
  2107. <foreign  name="audio" url="~audio/Ch07/07fig008.au">
  2108. <foreign  name="execute" url="!jarexe Run/fig07_08.jar">
  2109. <br>
  2110.  
  2111. </page>
  2112. <page>
  2113. <font size=18>Figure 7.9  Using a <b>static</b> data member to maintain a count of the number of objects 
  2114. of a class.</font><br>
  2115. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2116. <param  name="file" value="code/ch07/fig07_09.txt">
  2117. </applet><br>
  2118. <br>
  2119. <foreign  name="copy2disk" url="!jcpy Source/fig07_09.jar">
  2120. <foreign  name="audio" url="~audio/Ch07/07fig009.au">
  2121. <foreign  name="execute" url="!jarexe Run/fig07_09.jar">
  2122. <br>
  2123.  
  2124. </page>
  2125. <page>
  2126. Figure 7.10  Implementing a proxy class.<br>
  2127. <applet code=gsl.win.helper.TextBox width=580 height=300>
  2128. <param  name="file" value="code/ch07/fig07_10.txt">
  2129. </applet><br>
  2130. <br>
  2131. <foreign  name="copy2disk" url="!jcpy Source/fig07_10.jar">
  2132. <foreign  name="execute" url="!jarexe Run/fig07_10.jar">
  2133. <br>
  2134.  
  2135. </page>
  2136. </section>
  2137. <section type=Popup name=Practice title="Good Practices">
  2138. <page>
  2139. Declare as <b>const</b> all 
  2140. member functions that 
  2141. do not need to modify 
  2142. the current object so 
  2143. that you can use them 
  2144. on a <b>const </b>object if you 
  2145. need to.<br>
  2146. <br>
  2147.  
  2148. </page>
  2149. <page>
  2150. Place all friendship 
  2151. declarations first in the 
  2152. class immediately after 
  2153. the class header and do 
  2154. not precede them with 
  2155. any member-access 
  2156. specifier.<br>
  2157. <br>
  2158.  
  2159. </page>
  2160. <page>
  2161. Because C++ includes 
  2162. C, C++ programs can 
  2163. contain storage created 
  2164. by <b>malloc</b> and deleted 
  2165. by <b>free</b>, and objects 
  2166. created by <b>new</b> and 
  2167. deleted by <b>delete</b>. It is 
  2168. best to use only <b>new</b> 
  2169. and <b>delete</b>.<br>
  2170. <br>
  2171.  
  2172. </page>
  2173. <page>
  2174. After deleting 
  2175. dynamically allocated 
  2176. memory, set the pointer 
  2177. that referred to that 
  2178. memory to <b>0</b>. This 
  2179. disconnects the pointer 
  2180. from the previously 
  2181. allocated space on the 
  2182. free store.<br>
  2183. <br>
  2184.  
  2185. </page>
  2186. </section>
  2187. <section type=Popup name=Engineer title="Engineering">
  2188. <page>
  2189. Declaring an object as 
  2190. <b>const</b> helps enforce the 
  2191. principle of least 
  2192. privilege. Attempts to 
  2193. modify the object are 
  2194. caught at compile time 
  2195. rather than causing 
  2196. execution-time errors. <br>
  2197. <br>
  2198.  
  2199. </page>
  2200. <page>
  2201. Using <b>const</b> is crucial 
  2202. to proper class design, 
  2203. program design and 
  2204. coding.<br>
  2205. <br>
  2206.  
  2207. </page>
  2208. <page>
  2209. A <b>const </b>member 
  2210. function can be 
  2211. overloaded with a non-
  2212. <b>const </b>version. The 
  2213. choice of which 
  2214. overloaded member 
  2215. function to use is 
  2216. automatically made by 
  2217. the compiler based on <br>
  2218.  
  2219. </page>
  2220. <page>
  2221. whether the object is 
  2222. <b>const </b>or not. <br>
  2223. <br>
  2224.  
  2225. </page>
  2226. <page>
  2227. A <b>const</b> object cannot 
  2228. be modified by 
  2229. assignment so it must 
  2230. be initialized. When a a 
  2231. data member of a class 
  2232. is declared <b>const</b>, a 
  2233. member initializer must 
  2234. be used to provide the 
  2235. constructor with the 
  2236. initial value of the data <br>
  2237.  
  2238. </page>
  2239. <page>
  2240. member for an object of 
  2241. the class. <br>
  2242. <br>
  2243.  
  2244. </page>
  2245. <page>
  2246. Constant class 
  2247. members (<b>const </b>objects 
  2248. and <b>const</b> "variables") 
  2249. must be initialized with 
  2250. member initializer 
  2251. syntax; assignments are 
  2252. not allowed.<br>
  2253. <br>
  2254.  
  2255. </page>
  2256. <page>
  2257. A <b>const</b> object cannot 
  2258. be modified by 
  2259. assignment so it must 
  2260. be initialized. When a a 
  2261. data member of a class 
  2262. is declared <b>const</b>, a 
  2263. member initializer must 
  2264. be used to provide the 
  2265. constructor with the 
  2266. initial value of the data <br>
  2267.  
  2268. </page>
  2269. <page>
  2270. member for an object of 
  2271. the class. <br>
  2272. <br>
  2273.  
  2274. </page>
  2275. <page>
  2276. It is good practice to 
  2277. declare all of a class's 
  2278. member functions that 
  2279. do not modify the 
  2280. object in which they 
  2281. operate as <b>const</b>. 
  2282. Occasionally, this will 
  2283. be an anomaly because 
  2284. you will have no 
  2285. intention of creating <br>
  2286.  
  2287. </page>
  2288. <page>
  2289. <b>const</b> objects of that 
  2290. class. Declaring such 
  2291. member functions 
  2292. <b>const</b> does offer a 
  2293. benefit though. If you 
  2294. inadvertently modify 
  2295. the object in that 
  2296. member function, the 
  2297. compiler will issue a 
  2298. syntax error message.<br>
  2299.  
  2300. </page>
  2301. <page>
  2302. One form of software 
  2303. reusability is 
  2304. composition in which a 
  2305. class has objects of 
  2306. other classes as 
  2307. members.<br>
  2308. <br>
  2309.  
  2310. </page>
  2311. <page>
  2312. If a class has as a 
  2313. member an object of 
  2314. another class, making 
  2315. that member object 
  2316. <b>public</b> does not violate 
  2317. the encapsulation and 
  2318. hiding of that member 
  2319. object's <b>private 
  2320. </b>members.<br>
  2321. <br>
  2322.  
  2323. </page>
  2324. <page>
  2325. Even though the 
  2326. prototypes for <b>friend 
  2327. </b>functions appear in the 
  2328. class definition, <tt><i><b>friends</b></i></tt> 
  2329. are still not member 
  2330. functions.<br>
  2331. <br>
  2332.  
  2333. </page>
  2334. <page>
  2335. Member access notions 
  2336. of <b>private</b>, <b>protected</b>, 
  2337. and <b>public</b> are not 
  2338. relevant to friendship 
  2339. declarations, so 
  2340. friendship declarations 
  2341. can be placed anywhere 
  2342. in the class definition.<br>
  2343. <br>
  2344.  
  2345. </page>
  2346. <page>
  2347. Some people in the 
  2348. OOP community feel 
  2349. that "friendship" 
  2350. corrupts information 
  2351. hiding and weakens the 
  2352. value of the object-
  2353. oriented design 
  2354. approach. <br>
  2355. <br>
  2356.  
  2357. </page>
  2358. <page>
  2359. Because C++ is a 
  2360. hybrid language, it is 
  2361. common to have a mix 
  2362. of two types of function 
  2363. calls in one program 
  2364. and often back to 
  2365. back--C-like calls that 
  2366. pass primitive data or 
  2367. objects to functions and 
  2368. C++ calls that pass <br>
  2369.  
  2370. </page>
  2371. <page>
  2372. functions (or messages) 
  2373. to objects.<br>
  2374. <br>
  2375.  
  2376. </page>
  2377. <page>
  2378. Some organizations 
  2379. have in their software 
  2380. engineering standards 
  2381. that all calls to <b>static</b> 
  2382. member functions be 
  2383. made off the class name 
  2384. handle and not off the 
  2385. object handles.<br>
  2386. <br>
  2387.  
  2388. </page>
  2389. <page>
  2390. A class's <b>static</b> data 
  2391. members and <b>static</b> 
  2392. member functions exist 
  2393. and can be used even if 
  2394. no objects of that class 
  2395. have been instantiated.<br>
  2396. <br>
  2397.  
  2398. </page>
  2399. <page>
  2400. The programmer is able 
  2401. to create new types 
  2402. through the class 
  2403. mechanism. These new 
  2404. types can be designed 
  2405. to be used as 
  2406. conveniently as the 
  2407. built-in types. Thus, 
  2408. C++ is an extensible 
  2409. language. Although the <br>
  2410.  
  2411. </page>
  2412. <page>
  2413. language is easy to 
  2414. extend with these new 
  2415. types, the base 
  2416. language itself is not 
  2417. changeable.<br>
  2418. <br>
  2419.  
  2420. </page>
  2421. </section>
  2422. <section type=Popup name=Errors title="Common Errors">
  2423. <page>
  2424. Defining as <b>const</b> a 
  2425. member function that 
  2426. modifies a data member 
  2427. of an object is a syntax 
  2428. error.<br>
  2429.  
  2430. </page>
  2431. <page>
  2432. Defining as <b>const</b> a 
  2433. member function that 
  2434. calls a non-<b>const</b> 
  2435. member function of the 
  2436. class on the same 
  2437. instance of the class is a 
  2438. syntax error.<br>
  2439. <br>
  2440.  
  2441. </page>
  2442. <page>
  2443. Invoking a non-<b>const</b> 
  2444. member function on a 
  2445. <b>const</b> object is a syntax 
  2446. error.<br>
  2447. <br>
  2448.  
  2449. </page>
  2450. <page>
  2451. Attempting to declare a 
  2452. constructor or 
  2453. destructor <b>const</b> is a 
  2454. syntax error.<br>
  2455.  
  2456. </page>
  2457. <page>
  2458. Not providing a 
  2459. member initializer for a 
  2460. <b>const</b> data member is a 
  2461. syntax error.<br>
  2462.  
  2463. </page>
  2464. <page>
  2465. Not providing a default 
  2466. constructor for the class 
  2467. of a member object 
  2468. when no member 
  2469. initializer is provided 
  2470. for that member object 
  2471. is a syntax error.<br>
  2472.  
  2473. </page>
  2474. <page>
  2475. Attempting to use the 
  2476. member selection 
  2477. operator (<b>.</b>) with a 
  2478. pointer to an object is a 
  2479. syntax error--the dot 
  2480. member selection 
  2481. operator may only be 
  2482. used with an object or 
  2483. with a reference to an 
  2484. object.<br>
  2485.  
  2486. </page>
  2487. <page>
  2488. Mixing <b>new</b>-and-
  2489. <b>delete</b>-style dynamic 
  2490. memory allocation with 
  2491. <b>malloc</b>-and-<b>free</b>-style 
  2492. dynamic memory 
  2493. allocation is a logic 
  2494. error: Space created by 
  2495. <b>malloc</b> cannot be freed 
  2496. by <b>delete</b>; objects <br>
  2497.  
  2498. </page>
  2499. <page>
  2500. created by <b>new</b> cannot 
  2501. be deleted by <b>free</b>.<br>
  2502.  
  2503. </page>
  2504. <page>
  2505. Using <b>delete</b> instead of 
  2506. <b>delete []</b> for arrays can 
  2507. lead to runtime logic 
  2508. errors. To avoid 
  2509. problems, space created 
  2510. as an array should be 
  2511. deleted with the <b>delete 
  2512. []</b> operator and space 
  2513. created as an individual 
  2514. element should be <br>
  2515.  
  2516. </page>
  2517. <page>
  2518. deleted with the <b>delete</b> 
  2519. operator.<br>
  2520.  
  2521. </page>
  2522. <page>
  2523. It is a syntax error to 
  2524. include keyword <b>static</b> 
  2525. in the definition of a 
  2526. <b>static</b> class variable at 
  2527. file scope.<br>
  2528. <br>
  2529.  
  2530. </page>
  2531. <page>
  2532. Referring to the <b>this</b> 
  2533. pointer within a <b>static</b> 
  2534. member function is a 
  2535. syntax error.<br>
  2536. <br>
  2537.  
  2538. </page>
  2539. <page>
  2540. Declaring a <b>static</b> 
  2541. member function <b>const</b> 
  2542. is a syntax error.<br>
  2543. <br>
  2544.  
  2545. </page>
  2546. </section>
  2547.  
  2548. <section type=Popup name=Portable title="Portability">
  2549. <page>
  2550. This chapter does not contain any Portability tips.
  2551. </page>
  2552. </section>
  2553. <section type=Popup name=AppletPopup title="Applet Examples">
  2554. <page>
  2555. This chapter does not contain any Applet Examples.
  2556. </page>
  2557. </section>
  2558. </chapter>
  2559. </html>
  2560. </html>
  2561.